天天看點

Java -- 每日一問:什麼情況下Java程式會産生死鎖?如何定位、修複?

Java -- 每日一問:什麼情況下Java程式會産生死鎖?如何定位、修複?

典型回答

死鎖是一種特定的程式狀态,在實體之間,由于循環依賴導緻彼此一直處于等待之中,沒有任何個體可以繼續前進。死鎖不僅僅是線上程之間會發生,存在資源獨占的程序之間同樣也可能出現死鎖。通常來說,我們大多是聚焦在多線程場景中的死鎖,指兩個或多個線程之間,由于互相持有對方需要的鎖,而永久處于阻塞的狀态。

你可以利用下面的示例圖了解基本的死鎖問題:

Java -- 每日一問:什麼情況下Java程式會産生死鎖?如何定位、修複?

定位死鎖最常見的方式就是利用 jstack 等工具擷取線程棧,然後定位互相之間的依賴關系,進而找到死鎖。如果是比較明顯的死鎖,往往 jstack 等就能直接定位,類似 JConsole 甚至可以在圖形界面進行有限的死鎖檢測。