死鎖:死鎖是一種特定的程式狀態,在實體之間,由於迴圈依賴導致彼此一直處於等待之中,沒有任何個體可以繼續前進。
死鎖產生條件:
互斥條件
請求與保持條件
不可剝奪條件
環路等待條件
定位死鎖最常見的方式就是利用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 ...
什麼情況下用遞迴?
遞迴的特點,可以看出遞迴可以大大縮短程式的 有意識的使用遞迴,可以用較短的 解決一些複雜的問題。甚至有些問題非得使用遞迴解決不可。那麼什麼時候我們該使用遞迴呢?遞迴演算法的 基本思想 是 把規模大的 較難解決的問題變成規模較小的 易解決的同一問題。規模較小的問題又變成規模更小的問題,並且小到一定程度...