【校招VIP】什么是死锁及预防具体措施

05月13日 收藏 0 评论 0 测试开发

【校招VIP】什么是死锁及预防具体措施

文章声明:转载来源:https://blog.csdn.net/weixin_39734304/article/details/91912712

A线程持有独占锁a,去请求B线程的资源,而此时,B线程持有独占锁b,去请求A的资源。
两个线程互相持有对方的锁,发生了互斥,从而产生线程阻塞,此为死锁。

死锁发生的四个必要条件:
互斥条件:一个资源每次只能被一个进程使用,即在一段时间内某 资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。
请求与保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源 已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。
不可剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能 由获得该资源的进程自己来释放(只能是主动释放)。
循环等待条件:若干进程间形成首尾相接循环等待请求资源。

这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。

死锁的避免与预防:
死锁避免的基本思想:

系统对进程发出每一个系统能够满足的资源申请进行动态检查,并根据检查结果决定是否分配资源,如果分配后系统可能发生死锁,则不予分配,否则予以分配。这是一种保证系统不进入死锁状态的动态策略。

死锁避免和死锁预防的区别(跟燃烧的三要素差不多,预防就是破坏同时满足的条件):

死锁预防是设法至少破坏产生死锁的四个必要条件之一,
严格的防止死锁的出现,而死锁避免则不那么严格的限制产生死锁的必要条件的存在,
因为即使死锁的必要条件存在,也不一定发生死锁。
死锁避免是在系统运行过程中注意避免死锁的最终发生。

预防具体措施:
1.使用try-Lock的方法,设置超时时间,超时可以退出防止死锁;
2.使用concurrent并发类来代替手动写锁;
3.降低锁的使用粒度,不要几个方法都使用同一个锁。
4.减少同步的代码块。

C 0条回复 评论

帖子还没人回复快来抢沙发