在使用线程的使用过程中我们無法避免加锁的情况,那么加锁就可能会导致死锁如果出现了死锁的情况,我们需要怎么去解决的什么呢首先,我们来看下什么是死鎖下面这张图很形象的说明了什么是死锁,路口的四辆车都分别等待对面车道的车让行相互等待,形成了死锁的状态在线程中,死鎖是这样定义的一组相互竞争相同资源的线程因为相互等待而导致永久阻塞,这种现象就叫做死锁
用一个转账的示例来模拟死锁。
当峩们运行测试类后会发现当执行到某个时候,控制台会停止输出这个时候就是发生了死锁。
发生死锁必需以下四个条件同时满足
上面说到发生死锁必须同时满足四个条件,那么我们破坏其中一个条件,就可以解决的什么死锁的问题如果已经发生了死锁,一般没有什么好的方法来解决的什么只能通过重启应用,所以如果要解决的什么死锁问题最好的方式就是提前规避。
首先我们肯定不能去破坏第一个条件,锁的作用就是要互斥所以,只能去破坏其他三个条件
破坏第二个条件,占有且等待那么我们可以一次性去申請所有资源,就不会存在等待的问题了
对上面的示例进行改进:
经过这样处理之后就不会再出现死锁的问题了。
破坏不可抢占可以让占用部分资源的线程进一步申请资源,如果申请不到可以主动释放其他线程占用的资源,这样就可以把不可抢占的条件破坏掉
破坏循環等待,可以按照顺序来进行资源的处理
这里仅对TransferAccount进行修改,对传进来的账户的hashcode进行排序以保证顺序
但是在这个例子中会存在一个问題,最后变成总是从一个相同的账户转到另一个账号最终有一个账户的余额为0.
签箌排名:今日本吧第个签到
本吧因你更精彩,明天继续来努力!
成为超级会员使用一键签到
成为超级会员,赠送8张补签卡
点击日历上漏签日期即可进行补签。
超级会员单次开通12个月以上赠送连续签到卡3张
该楼层疑似违规已被系统折叠
该楼层疑似违规已被系统折叠