52、Java死锁产生的四个条件及处理
死鎖是指兩個或兩個以上的進程(線程)在運行過程中因爭奪資源而造成的一種僵局(Deadly-Embrace) ) ,若無外力作用,這些進程(線程)都將無法向前推進。
死鎖產生的原因:
一、競爭不可搶占資源引起死鎖
系統中擁有兩個進程P1和P2,它們都準備寫兩個文件F1和F2。而這兩者都屬于可重用和不可搶占性資源。如果進程P1在打開F1的同時,P2進程打開F2文件,當P1想打開F2時由于F2已結被占用而阻塞,當P2想打開1時由于F1已結被占用而阻塞,此時就會無線等待下去,形成死鎖。
二、競爭可消耗資源引起死鎖
三、進程推進順序不當引起死鎖
死鎖的四個必要條件:
一、互斥
即當資源被一個線程使用(占有)時,別的線程不能使用
背景:A 和B 兩個線程同時執行吃飯(需要同時擁有 筷子和碗),有一雙筷子 和一個碗。
互斥 : 當A 獲得筷子(碗)時,B不能再獲得筷子(碗)。
二、不可搶占
資源請求者不能強制從資源占有者手中奪取資源,資源只能由資源占用者
主動釋放
不可占用: 當A獲得筷子(碗)時,B不能搶占A已經獲得的筷子(碗)。
三、請求與保持
當資源的請求者在請求其他的資源的同時保持對原有資源的占有
請求與保持: A獲得筷子(碗)時,再想獲得B線程的碗(筷子)。A在請求獲取碗(筷子)的時候,仍然占用筷子(碗)
四、循環等待
即存在一個等待隊列: P1占有P2的資源,P2占有P3的資源,P3占有P1的資源。
這樣就形成了一個等待環路。
循環等待: A 持有筷子,請求等待獲得 B持有的碗;
B持有碗,請求等待獲得 A持有的筷子
死鎖處理方法:
1.預防死鎖:通過設置一些限制條件,去破壞產生死鎖的必要條件
2.避免死鎖:在資源分配過程中,使用某種方法避免系統進入不安全的狀態,從而避免發生死鎖
3.檢測死鎖:允許死鎖的發生,但是通過系統的檢測之后,采取一些措施,將死鎖清除掉
4.解除死鎖:該方法與檢測死鎖配合使用
引用參考
https://www.jianshu.com/p/2dded5aae189
https://blog.csdn.net/wljliujuan/article/details/79614019
https://blog.csdn.net/guaiguaihenguai/article/details/80303835
https://www.cnblogs.com/jijiji/p/4855581.html
總結
以上是生活随笔為你收集整理的52、Java死锁产生的四个条件及处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【latex】经验总结(待整理)
- 下一篇: java代码生成密钥库_【Java加解密