- 死锁是指在多线程情况下,两个或两个以上线程在执行过程中,因争夺独占资源而出现的互相等待的现象。
- 产生死锁的必要条件
1)互斥条件:指线程间竞争的资源具有独占性,一旦被某个线程获取,则其他线程只能等待
2)持有并保持:指一个线程获取到了至少一个线程,又要获取其他资源,而该资源正被其他线程持有,此时这个线程只能阻塞,同时又不释放自己已持有的资源。
3)不可剥夺:指线程获取到的资源在使用完之前不可以被其他线程抢走,只能由该线程释放。
4)循环等待:指发生死锁时,必然存在一条环形等待链,即多个线程T0,T1,T2…Tn,T0等待T1释放资源,T1等待T2释放资源…Tn等待T0释放资源。 - 避免死锁
只需要破坏产生死锁的四个必要条件之一即可,但是实际上只能破坏请求与保持、循环等待两个条件
1)资源有序性
资源有序性是指,线程A和线程B都需要资源1,2,3,4…n,在线程执行过程中,只有获取到了资源n-1,才能再去获取资源n,例如线程A获取到了1,并想要获取2,在只有A和B两个线程的情况,A一定可以得到,因为B没有持有1也就不会持有2,这样就避免了死锁的方法。
资源有序性破坏了线程的持有并保持与循环等待条件。
2)超时加锁
为线程获取锁指定一个超时时间,在超过这个时间后,线程放弃对锁的获取同时释放已获取到的资源,这样可以让其他线程得到这些资源并能够执行完毕,该线程在等待一段时间后重试。
Java死锁
最新推荐文章于 2024-01-08 12:47:17 发布