Java多線程 死鎖含義,死鎖的危害,墨菲定律
死鎖的含義
死鎖是一定發(fā)生在并發(fā)中的.
互不相讓: ?當(dāng)兩個(gè)或者更多的線程(或進(jìn)程)相互持有對(duì)方所需要的資源, 又不主動(dòng)釋放鎖, 導(dǎo)致所有人都無(wú)法繼續(xù)執(zhí)行下去, ?導(dǎo)致程序陷入無(wú)盡的阻塞, 這就是死鎖.
例如下圖,線程A持有鎖1 ,想去拿鎖2, 線程B持有鎖2, 想去拿鎖1, 但是此時(shí)釋放都不釋放自己的鎖, 那么就會(huì)進(jìn)入無(wú)盡的阻塞. ?
鎖的特性是只能被一個(gè)線程所擁有

如果多個(gè)線程之間的依賴(lài)關(guān)系是環(huán)形, 存在環(huán)路的鎖的依賴(lài)關(guān)系, 那么也可能會(huì)發(fā)生死鎖.
如下圖所示, 三個(gè)線程死鎖的環(huán)路. 除非拿到了想要的鎖, 才會(huì)釋放資源.

死鎖的影響
死鎖的影響在不同的系統(tǒng)中表現(xiàn)不一樣 , ?取決于系統(tǒng)對(duì)于死鎖的處理能力.
例如在數(shù)據(jù)庫(kù)中, 有檢測(cè)并且釋放事務(wù)的能力. 如果數(shù)據(jù)庫(kù)中兩個(gè)事務(wù)發(fā)生了死鎖的情況, 那么數(shù)據(jù)庫(kù)就能檢測(cè)到, 并且指定某個(gè)事務(wù)進(jìn)行放棄鎖, 此時(shí)就不會(huì)造成死鎖.
JVM不具備自動(dòng)處理死鎖的能力. 因?yàn)槌鲇诎踩缘目紤],處理死鎖的方式有很多 , 不能擅自的替程序員去判斷如何修復(fù)死鎖. ?例如某個(gè)線程非常的重要, 寧可發(fā)生死鎖也不能進(jìn)行強(qiáng)制的中斷.
死鎖的危害--墨菲定律
墨菲定律: 雖然死鎖的發(fā)生幾率不高, 但是隨著時(shí)間的推移,一定會(huì)發(fā)生.
一旦發(fā)生死鎖, 影響的用戶(hù)就很多, 可能會(huì)造成整個(gè)系統(tǒng)的崩潰, 子系統(tǒng)的崩潰,降低了系統(tǒng)的性能.
并且壓力測(cè)試并不能找出所有潛在的死鎖, 鎖的獲取可能是隨機(jī)的, 那么發(fā)生死鎖也是隨機(jī)的.?