Java多線程產(chǎn)生死鎖的必要條件
線程死鎖是指由于兩個或者多個線程互相持有對方所需要的資源,導(dǎo)致這些線程處于等待狀態(tài),無法前往執(zhí)行。當(dāng)線程進(jìn)入對象的synchronized代碼塊時,便占有了資源,直到它退出該代碼塊或者調(diào)用wait方法,才釋放資源,在此期間,其他線程將不能進(jìn)入該代碼塊。當(dāng)線程互相持有對方所需要的資源時,會互相等待對方釋放資源,如果線程都不主動釋放所占有的資源,將產(chǎn)生死鎖。
死鎖是操作系統(tǒng)里里面的一個重要的概念,死鎖通常發(fā)生在并發(fā)的場景里。
死鎖是多個進(jìn)程或線程,彼此爭搶資源而陷入僵局的一種情況。
在筆者參加的多次面試中,發(fā)現(xiàn)不少候選人雖然大概知道死鎖是一種因?yàn)闋帗屬Y源引起的問題,但真的要寫一個死鎖的例子的話,還是有不少候選人不知道該如何下手。
其實(shí),真正理清楚了死鎖產(chǎn)生的必要的條件,寫出一個死鎖的例子并不困難。那么,就java的多線程而言,產(chǎn)生死鎖有哪些必要條件呢?
- 1,必須有2個或以上的線程。一個線程是不會產(chǎn)生死鎖的,它頂多產(chǎn)生等待。
- 2,必須有2個臨界資源,即,必須有2個鎖。這也是死鎖產(chǎn)生的必要的條件。當(dāng)只有一個臨界資源,或者說只有一個鎖時,當(dāng)一個線程獲取了鎖,另一個線程雖然暫時無法獲取鎖,但它至多也就是需要進(jìn)行等待。而不會陷入死鎖。
- 3,兩個線程,每個線程都獲取了其中的一個鎖,但為了完成工作,還需對方的另一個鎖。這種情況下,才會產(chǎn)生死鎖。這種情況也稱為循環(huán)等待。
- 4,不可剝奪。
以上即為死鎖產(chǎn)生的必要條件。
避免死鎖可以概括成三種方法:
- 固定加鎖的順序(針對鎖順序死鎖)
- 開放調(diào)用(針對對象之間協(xié)作造成的死鎖)
- 使用定時鎖-->tryLock()
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
相關(guān)文章
Spring Cloud Stream微服務(wù)消息框架原理及實(shí)例解析
這篇文章主要介紹了Spring Cloud Stream微服務(wù)消息框架原理及實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06實(shí)例詳解SpringBoot默認(rèn)的JSON解析方案
JSON數(shù)據(jù)現(xiàn)在是我們開發(fā)中用的最多的,百分之九十的數(shù)據(jù)都是通過JSON方式進(jìn)行傳輸,下面這篇文章主要給大家介紹了關(guān)于SpringBoot默認(rèn)的JSON解析方案的相關(guān)資料,需要的朋友可以參考下2021-08-08解決lambda表達(dá)式內(nèi)出現(xiàn)異常無法throw拋出的問題
這篇文章主要介紹了lambda表達(dá)式內(nèi)出現(xiàn)異常無法throw拋出的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09Java中常見的日期操作(取值、轉(zhuǎn)換、加減、比較)
本文給大家介紹java中常見的日期操作,日期取值、日期轉(zhuǎn)換、日期加減、日期比較,對java日期操作相關(guān)知識感興趣的朋友一起學(xué)習(xí)吧2015-12-12詳解SpringBoot 添加對JSP的支持(附常見坑點(diǎn))
這篇文章主要介紹了詳解SpringBoot 添加對JSP的支持(附常見坑點(diǎn)),非常具有實(shí)用價值,需要的朋友可以參考下2017-10-10Spring中的兩種代理JDK和CGLIB的區(qū)別淺談
本篇文章中主要介紹了Spring中的兩種代理JDK和CGLIB的區(qū)別淺談,詳解的介紹了JDK和CGLIB的原理和方法,有需要的朋友可以了解一下2017-04-04