死鎖的產生和避免

2021-08-25 14:34:33 字數 1485 閱讀 4675

死鎖的產生和避免

死鎖的定義

該組程序(執行緒)的每乙個程序(執行緒)都在等待僅由該組程序(執行緒)的其他程序(執行緒),才能引發的事件,該程序(執行緒)是死鎖的

引入鎖是為了解決多執行緒直接的同步與互斥問題

1 執行緒自己將自己鎖住

同乙個執行緒先後兩次呼叫lock,第二次呼叫時由於鎖已經被占用,該執行緒會掛起等待,然而鎖是被自己占用,該執行緒被掛起沒有機會釋放,因此永遠處於等待狀態形成死鎖

2多執行緒搶占資源被困

執行緒a獲得鎖1,執行緒b獲得鎖2,

執行緒a呼叫lock試圖獲得鎖2,結果需要掛起等待執行緒b釋放鎖2,

同時執行緒b呼叫lock試圖獲得鎖1,結果需要掛起等待執行緒a釋放鎖1

於是乎執行緒a,b永遠處於掛起狀態

1、競爭不可搶占資源

例如共享檔案時引起死鎖

系統中有兩個程序p1和p2,他們都準備寫兩個檔案,這兩者都屬於可重用,不可搶占性資源

當p1開啟f1同時p2開啟f2,當p1想開啟f2的時候,f2已經被占用引起p1阻塞

2、競爭可消耗資源

例如程序間通訊引起死鎖

系統中三個程序p1,p2,p3 其中m1,m2,m3是可消耗資源,程序1產生m1,接收程序3發來的m3, 程序2產生m2,接收來自程序p1發來的m1, 程序p3產生m3,接收來自程序p2發來的m2

如果每個程序都先傳送訊息,則可用順利執行,但如果每個程序都先接收別人的訊息而不產生訊息,則會永遠等待下去

* 3、程序推進順序不當*

1、互斥條件

程序(執行緒)所申請的資源在一段時間內只能被乙個程序(執行緒)鎖占用。

2、請求和保持條件

該程序(執行緒)已經占有至少乙個資源,但又提出新的資源請求, 而該資源被其他程序(執行緒)占用

3、不可搶占條件

程序(執行緒)已經獲得的資源在未使用完之前不能被搶占

4、迴圈等待條件

傳送死鎖時必然存在乙個程序(執行緒)資源的迴圈鏈

死鎖的處理方法

1、預防死鎖 :破壞死鎖產生的必要條件中的乙個或多個(互斥條件不可破壞)

2、避免死鎖 : 在資源分配過程中,防止系統進入不安全區域

3、檢測死鎖 :檢測出死鎖的傳送,採取措施解出死鎖

4、解出死鎖 :檢測出死鎖後,採取措施解出死鎖

利用銀行家演算法避免死鎖

每乙個執行緒進入系統,宣告執行時所需要型別資源的最大數(不超過系統擁有的總量),

執行緒請求一組資源時,系統必須確定是否有足夠的資源給該程序,

如果有則進一步計算資源分配給程序後,是否會讓系統處於不安全的狀態

如果分配資源的時候能找安全的序列則將資源分配給它,否則等待。

避免死鎖的產生

死鎖是指兩個或兩個以上的程序在執行過程中,由於競爭資源或者由於彼此通訊而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。第乙個建議往往是最簡單的 乙個執行緒已獲得乙個鎖時,再別去獲取第二個。如果能堅持這個建議,因...

死鎖產生的原因和避免死鎖的方法

執行緒t1拿到鎖因為一些異常沒有釋放鎖,執行緒t1和t2互相等待對方釋放鎖。public class deadlockdemo private void deadlock catch interruptedexception e synchronized b thread t2 newthread ...

死鎖,產生原因,避免

什麼是死鎖 死鎖是指多個程序因競爭資源而造成的一種僵局 互相等待 若無外力作用,這些程序都將無法向前推進。例如,在某乙個計算機系統中只有一台印表機和一台輸入 裝置,程序p1正占用輸入裝置,同時又提出使用印表機的請求,但此時印表機正被程序p2 所占用,而p2在未釋放印表機之前,又提出請求使用正被p1占...