首頁技術(shù)文章正文

死鎖產(chǎn)生的四個必要條件是什么?如何避免死鎖?

更新時間:2021-05-07 來源:黑馬程序員 瀏覽量:

死鎖產(chǎn)生的四個必要條件:

互斥:一個資源每次只能被一個進程使用(資源獨立)。

請求與保持:一個進程因請求資源而阻塞時,對已獲得的資源保持不放(不釋放鎖)。

不剝奪:進程已獲得的資源,在未使用之前,不能強行剝奪(搶奪資源)。

循環(huán)等待:若干進程之間形成一種頭尾相接的循環(huán)等待的資源關(guān)閉(死循環(huán))。

死鎖


如何避免死鎖?

1. 破壞”互斥”條件:系統(tǒng)里取消互斥、若資源一般不被一個進程獨占使用,那么死鎖是肯定不會發(fā)生的,但一般“互斥”條件是無法破壞的,因此,在死鎖預(yù)防里主要是破壞其他三個必要條件,而不去涉及破壞“互斥”條件。

2. 破壞“請求和保持”條件:

方法1:所有的進程在開始運行之前,必須一次性的申請其在整個運行過程各種所需要的全部資源。

優(yōu)點:簡單易實施且安全。

缺點:因為某項資源不滿足,進程無法啟動,而其他已經(jīng)滿足了的資源也不會得到利用,嚴重降低了資源的利用率,造成資源浪費。

方法2:該方法是對第一種方法的改進,允許進程只獲得運行初期需要的資源,便開始運行,在運行過程中逐步釋放掉分配到,已經(jīng)使用完畢的資源,然后再去請求新的資源。這樣的話資源的利用率會得到提高,也會減少進程的饑餓問題。

3. 破壞“不剝奪”條件:當一個已經(jīng)持有了一些資源的進程在提出新的資源請求沒有得到滿足時,它必須釋放已經(jīng)保持的所有資源,待以后需要使用的時候再重新申請。這就意味著進程已占有的資源會被短暫的釋放或者說被搶占了。

4. 破壞“循環(huán)等待”條件:可以通過定義資源類型的線性順序來預(yù)防,可以將每個資源編號,當一個進程占有編號為i 的資源時,那么它下一次申請資源只能申請編號大于i 的資源。

1577370495235_學(xué)IT就到黑馬程序員.gif



猜你喜歡:

Redis分布式鎖實現(xiàn)原理和分布式阻塞隊列

分布式鎖是什么?有什么作用?

Java自旋鎖是什么?有什么優(yōu)缺點?

黑馬程序員Java開發(fā)培訓(xùn)課程

分享到:
在線咨詢 我要報名
和我們在線交談!