概念 線程死鎖描述的是這樣一種情況:多個線程同時被阻塞,它們中的一個或者全部都在等待某個資源被釋放。由於線程被無限期地阻塞,因此程式不可能正常終止。 我和同學都打掃衛生,我拿著掃帚等他的簸箕,他拿著簸箕等我的掃帚 產生條件 互斥條件:同一時刻一線程只能占用一個資源。 同一時刻,我拿著掃帚,他拿著簸箕 ...
概念
線程死鎖描述的是這樣一種情況:多個線程同時被阻塞,它們中的一個或者全部都在等待某個資源被釋放。由於線程被無限期地阻塞,因此程式不可能正常終止。
我和同學都打掃衛生,我拿著掃帚等他的簸箕,他拿著簸箕等我的掃帚
產生條件
-
互斥條件:同一時刻一線程只能占用一個資源。
-
同一時刻,我拿著掃帚,他拿著簸箕。
-
-
請求與保持:一個線程因請求資源而阻塞時,對已獲得的資源保持不放。
-
我在等他的簸箕,但我不會讓出我的掃帚
-
-
不可剝奪:已獲得的資源在為使用完時,其他線程不能強行剝奪。
-
我拿著掃帚,但是我不能去強搶他拿的簸箕
-
-
迴圈等待
-
我拿著掃帚等他的簸箕,他拿著簸箕等我的掃帚,形成閉環
-
如何避免
打破產生條件即可
- 破壞 互斥條件:無法被破壞,因為鎖就是通過互斥來解決線程安全問題
- 破壞 請求與保持條件:一次申請所有需要的資源
- 破壞 不可剝奪條件:如果線程已占用部分資源,且他還要申請其他資源,如果申請不到,就主動釋放它自己占有的資源
- 破壞 迴圈等待條件:按照順序申請資源,釋放資源則逆序
參考:JavaGuid