前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布

死锁

作者头像
程序源代码
发布2019-03-14 16:03:33
6980
发布2019-03-14 16:03:33
举报
文章被收录于专栏:程序源代码程序源代码

在多线程问题解决中经常用到锁和条件。但锁和条件不能解决多线程中的所有问题。有两个银行账户:账户1:$200,账号2:$300。现在需要程序进行如下操作:线程1:从账户1转移$300到账户2,从账户2 转移$400到账号1。大家可以想想会发生什么?因为账户1和账户2中的余额全都不足,导致线程1和线程2都无法执行。

当一个线程要等待更多的钱存入而导致其他线程都阻塞,这时候的状态一般可以成为死锁。

死锁与活锁的区别,死锁与饥饿的区别?

死锁:是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。产生死锁的必要条件:互斥条件:所谓互斥就是进程在某一时间内独占资源。请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。不剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺。循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

活锁:任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试、失败、尝试、失败。

活锁和死锁的区别在于,处于活锁的实体是在不断的改变状态,所谓的“活”, 而处于死锁的实体表现为等待;活锁有可能自行解开,死锁则不能。饥饿:一个或者多个线程因为种种原因无法获得所需要的资源,导致一直无法执行的状态。Java中导致饥饿的原因:高优先级线程吞噬所有的低优先级线程的CPU时间。线程被永久堵塞在一个等待进入同步块的状态,因为其他线程总是能在它之前持续地对该同步块进行访问。线程在等待一个本身也处于永久等待完成的对象(比如调用这个对象的wait方法),因为其他线程总是被持续地获得唤醒。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-03-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序源代码 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
访问管理
访问管理(Cloud Access Management,CAM)可以帮助您安全、便捷地管理对腾讯云服务和资源的访问。您可以使用CAM创建子用户、用户组和角色,并通过策略控制其访问范围。CAM支持用户和角色SSO能力,您可以根据具体管理场景针对性设置企业内用户和腾讯云的互通能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档