溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java多線程產(chǎn)生死鎖的必要條件

發(fā)布時(shí)間:2020-09-03 00:41:06 來源:腳本之家 閱讀:190 作者:李燦輝 欄目:編程語言

線程死鎖是指由于兩個(gè)或者多個(gè)線程互相持有對(duì)方所需要的資源,導(dǎo)致這些線程處于等待狀態(tài),無法前往執(zhí)行。當(dāng)線程進(jìn)入對(duì)象的synchronized代碼塊時(shí),便占有了資源,直到它退出該代碼塊或者調(diào)用wait方法,才釋放資源,在此期間,其他線程將不能進(jìn)入該代碼塊。當(dāng)線程互相持有對(duì)方所需要的資源時(shí),會(huì)互相等待對(duì)方釋放資源,如果線程都不主動(dòng)釋放所占有的資源,將產(chǎn)生死鎖。

死鎖是操作系統(tǒng)里里面的一個(gè)重要的概念,死鎖通常發(fā)生在并發(fā)的場(chǎng)景里。

死鎖是多個(gè)進(jìn)程或線程,彼此爭(zhēng)搶資源而陷入僵局的一種情況。

在筆者參加的多次面試中,發(fā)現(xiàn)不少候選人雖然大概知道死鎖是一種因?yàn)闋?zhēng)搶資源引起的問題,但真的要寫一個(gè)死鎖的例子的話,還是有不少候選人不知道該如何下手。

其實(shí),真正理清楚了死鎖產(chǎn)生的必要的條件,寫出一個(gè)死鎖的例子并不困難。那么,就java的多線程而言,產(chǎn)生死鎖有哪些必要條件呢?

  • 1,必須有2個(gè)或以上的線程。一個(gè)線程是不會(huì)產(chǎn)生死鎖的,它頂多產(chǎn)生等待。
  • 2,必須有2個(gè)臨界資源,即,必須有2個(gè)鎖。這也是死鎖產(chǎn)生的必要的條件。當(dāng)只有一個(gè)臨界資源,或者說只有一個(gè)鎖時(shí),當(dāng)一個(gè)線程獲取了鎖,另一個(gè)線程雖然暫時(shí)無法獲取鎖,但它至多也就是需要進(jìn)行等待。而不會(huì)陷入死鎖。
  • 3,兩個(gè)線程,每個(gè)線程都獲取了其中的一個(gè)鎖,但為了完成工作,還需對(duì)方的另一個(gè)鎖。這種情況下,才會(huì)產(chǎn)生死鎖。這種情況也稱為循環(huán)等待。
  • 4,不可剝奪。

以上即為死鎖產(chǎn)生的必要條件。

避免死鎖可以概括成三種方法:

  • 固定加鎖的順序(針對(duì)鎖順序死鎖)
  • 開放調(diào)用(針對(duì)對(duì)象之間協(xié)作造成的死鎖)
  • 使用定時(shí)鎖-->tryLock()

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)億速云的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI