死鎖的情況和避免方法

2021-09-24 03:47:20 字數 920 閱讀 4601

在多執行緒併發中,就會遇到死鎖的情況。

死鎖的乙個定義就是:一組互相競爭資源的執行緒因互相等待,導致永久阻塞的現象。

比如一組操作需要同時獲取兩個鎖1,2,執行緒a執行緒獲取鎖1的同時,執行緒b同時獲取鎖2,那麼執行緒1,2同時去獲取對方的鎖,而雙方本身都又在等待多方的鎖,那麼就陷入乙個無限的死迴圈中,導致死鎖。

只有以下情況都發生時才會出現死鎖:

1.互斥,共享資源x和y只能被乙個執行緒占用。

2.占用且等待,執行緒t1已經獲得共享資源x,在等待共享資源y的時候,不釋放共享資源x;

3.不可搶占,其他執行緒不能強行搶占執行緒t1占有的資源。

4.迴圈等待,執行緒t1等待執行緒t2占有的資源,執行緒t2等待執行緒t1占有的資源,就是迴圈等待。

那麼解決問題的方法就在於破壞執行緒死鎖的條件,導致影響執行緒死鎖的條件不成立即可。

1.破壞占用且等待的條件。即只要乙個執行緒需要獲取2個鎖時才能進行的操作,那麼我們只要建立乙個物件,物件去同時獲取2個鎖,再來個方法同時釋放2個鎖。這樣任意執行緒去獲取的時候,要麼都拿到鎖進行操作,其餘沒拿到鎖的執行緒就進行等待。

2.破壞不可搶占的條件。主動釋放資源,即如果當前執行緒獲取不到全部的鎖,那麼主動釋放自身擁有的鎖,等待全部獲得鎖的機會。

3.破壞迴圈等待條件。 要想破壞這個條件,必須對資源進行排序,然後按序申請資源。根據獲取的id比較大小,按照從小到大順序來申請鎖,這樣就不會存在迴圈等待的條件了。這樣有點樂觀鎖的感覺。為啥這樣做能解決迴圈等待問題。因為當2個執行緒去獲取鎖,按照從小到大的情況排序去獲取鎖,那麼大於等於2個執行緒去獲取,只會其中乙個執行緒拿到最小的鎖,才能去拿第二鎖,如果連第乙個鎖都拿不到,自然其他執行緒就不能進入第二個鎖的獲取**部分。於是便解決了迴圈等待問題。

總結:當加鎖的時候,就要想到避免死鎖的情況。考慮最好的解決方案。

死鎖的原因 條件和避免死鎖的方法

產生死鎖的原因主要是 1 因為系統資源不足。2 程序執行推進的順序不合適。3 資源分配不當等。產生死鎖的四個必要條件 1 互斥條件 乙個資源每次只能被乙個程序使用。2 請求與保持條件 乙個程序因請求資源而阻塞時,對已獲得的資源保持不放。3 不剝奪條件 程序已獲得的資源,在末使用完之前,不能強行剝奪。...

死鎖的原因 條件和避免死鎖的方法

產生死鎖的原因主要是 1 因為系統資源不足。2 程序執行推進的順序不合適。3 資源分配不當等。產生死鎖的四個必要條件 1 互斥條件 乙個資源每次只能被乙個程序使用。2 請求與保持條件 乙個程序因請求資源而阻塞時,對已獲得的資源保持不放。3 不剝奪條件 程序已獲得的資源,在末使用完之前,不能強行剝奪。...

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

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