Java學習(30) -- 併發編程(線程安全)

一、死鎖

死鎖概念及產生原理
    概念:多個併發進程因爭奪系統資源而產生相互等待的現象。
    原理:當一組進程中的每個進程都在等待某個事件發生,而只有這組進程中的其他進程才能觸發該事件,這就稱這組進程發生了死鎖。
    本質原因
        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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章