一、死鎖
死鎖概念及產生原理
概念:多個併發進程因爭奪系統資源而產生相互等待的現象。
原理:當一組進程中的每個進程都在等待某個事件發生,而只有這組進程中的其他進程才能觸發該事件,這就稱這組進程發生了死鎖。
本質原因:
1)、系統資源有限。
2)、進程推進順序不合理。
死鎖產生的4個必要條件
1、互斥:某種資源一次只允許一個進程訪問,即該資源一旦分配給某個進程,其他進程就不能再訪問,直到該進程訪問結束。
2、佔有且等待:一個進程本身佔有資源(一種或多種),同時還有資源未得到滿足,正在等待其他進程釋放該資源。
3、不可搶佔:別人已經佔有了某項資源,你不能因爲自己也需要該資源,就去把別人的資源搶過來。
4、循環等待:存在一個進程鏈,使得每個進程都佔有下一個進程所需的至少一種資源。
當以上四個條件均滿足,必然會造成死鎖,發生死鎖的進程無法進行下去,它們所持有的資源也無法釋放。這樣會導致CPU的吞吐量下降。所以死鎖情況是會浪費系統資源和影響計算機的使用性能的。那麼,解決死鎖問題就是相當有必要的了。
二、死鎖排查
利用jstack
定位死鎖
(1)、 在cmd窗口,使用jps指令查詢該類的端口號(3408)
(2)、再使用 jstack + 端口號查看日誌(jstack 3408):
發現出現死鎖,並且該日誌也定位了出現死鎖的位置,接下來就是進行修復工作了!
TIP:在實際應用中,死鎖情況未必有如此清晰的輸出,但是總體上的分析步驟爲:
區分線程狀態 -> 查看等待目標 -> 對比 Monitor 等持有狀態
三、線程安全和內存模型的關係
請參考:https://blog.csdn.net/mikeoperfect/article/details/79133899