java什麼情況下產生死鎖?如何定位修復?

2021-08-28 08:31:05 字數 817 閱讀 4646

死鎖:死鎖是一種特定的程式狀態,在實體之間,由於迴圈依賴導致彼此一直處於等待之中,沒有任何個體可以繼續前進。

死鎖產生條件:

互斥條件

請求與保持條件

不可剝奪條件

環路等待條件

定位死鎖最常見的方式就是利用jstack工具獲取執行緒棧,然後定位相互之間的依賴關係,進而找到死鎖。

死鎖例項:

public class deadlocksample extends thread 

public void run()

} catch (interruptedexception e) }}

public static void main(string args) throws interruptedexception

}

首先模擬問題定位,使用jstack,使用 jps或者系統的ps命令、任務管理器等工具,確定程序id。

然後獲取執行緒棧:

由圖可知,找到處於blocked狀態的執行緒,按照試圖獲取(waiting)的鎖id查詢,很快就定位問題。

避免死鎖的方法思路:

盡量避免使用多個鎖,並且只有需要的時候才持有鎖。

如果使用多個鎖,盡量設計好鎖的獲取順序。例如銀行家演算法。

使用帶超時的方法,為程式帶來更多的可控性。

關於銀行家演算法的一篇部落格(非自己的)

銀行家演算法

C 什麼情況下會產生臨時變數

臨時變數是只在呼叫期間有效,具有常性的一種變數。在返回值以值傳遞 傳值和傳指標 的形式返回時,會生成臨時變數。int sum int a,int b 編譯器會將結果a b的值拷貝給臨時變數,最終返回的是臨時變數 在函式呼叫中,如果形參是引用的型別的情況下 當實參和形參的型別不匹配會產生臨時變數 st...

什麼情況會發生死鎖,死鎖的處理方法

如兩個程序分別等待對方占有的資源,於是兩個程序都不能執行而處於等待狀態,此執行緒稱為死鎖。程序的三態模型 就緒態 leftrightarrow 執行態 to 等待態 to 就緒態 程序的五態模型 建立程序 to 就緒態 leftrightarrow 執行態 to 等待態 to 就緒態 執行態 to ...

什麼情況下用遞迴?

遞迴的特點,可以看出遞迴可以大大縮短程式的 有意識的使用遞迴,可以用較短的 解決一些複雜的問題。甚至有些問題非得使用遞迴解決不可。那麼什麼時候我們該使用遞迴呢?遞迴演算法的 基本思想 是 把規模大的 較難解決的問題變成規模較小的 易解決的同一問題。規模較小的問題又變成規模更小的問題,並且小到一定程度...