java-synchronized 嵌套使用代碼詳解
當synchronized使用過多時,可能會造成死鎖,那么死鎖到底是怎么一回事呢。先看下面的代碼,實現(xiàn)死鎖:
//死鎖的實現(xiàn) classA { publicvoidget(){ System.out.println("A說:我開始啟動了,B,給我你的資源"); } publicvoidsay(){ System.out.println("A獲得資源"); } } classB { publicvoidget(){ System.out.println("B說:我開始啟動了,A,給我你的資源"); } publicvoidsay(){ System.out.println("B獲得資源"); } } classMyThreadimplementsRunnable { publicstaticAa=newA(); publicstaticBb=newB(); publicbooleanflag=false; publicvoidrun(){ if(flag){ synchronized(a){ a.get(); try{ Thread.sleep(500); }catch(InterruptedExceptione){} synchronized(b){ //此同步代碼塊在另一同步代碼塊里 a.say(); } } }else{ synchronized(b){ b.get(); try{ Thread.sleep(500); }catch(InterruptedExceptione){} synchronized(a){ //此同步代碼塊在另一同步代碼塊里 b.say(); } } } } } publicclassDemo24 { publicstaticvoidmain(Stringargs[]){ MyThreadmt1=newMyThread(); MyThreadmt2=newMyThread(); mt1.flag=true; mt2.flag=false; Threadth1=newThread(mt1); Threadth2=newThread(mt2); th1.start(); th2.start(); } }
以上代碼由于 synchronized 的同步造成了死鎖,死鎖是兩個或多個線程同時等待對方的完成,而程序無法繼續(xù)執(zhí)行。在解釋代碼前,首先要明白synchronized到底是怎么一回事。synchronized 定義同步,那么同步的什么,什么和什么同步了?
首先,我們得知道,什么是鎖。在java中,每一個對象都有一個內(nèi)部鎖,如果以方法或代碼塊用 synchronized 進行聲明,那么對象的鎖將保護整個方法或代碼塊,要調(diào)用這個方法或者執(zhí)行這個代碼塊,必須獲得這個對象的鎖。而且,任何時候都只能有一個線程對象執(zhí)行被保護的代碼
在以上代碼中,在線程th1啟動后,他就獲得了a的鎖,同時當其休眠完畢,求會申請獲得b的鎖,而此時,他的a鎖沒有放棄。在線程th2啟動后,他就獲得了b的鎖,同時當其休眠完畢,求會申請獲得a的鎖,而此時,他的b鎖沒有放棄。
兩方都握有自己的鎖不放棄,而同時申請另一方的鎖,所以,此時就造成了死鎖。
同步,同步的就是線程和對象,將線程和對象進行綁定,獲取對象的鎖。
注意:通過以上代碼可以發(fā)現(xiàn),死鎖的必要條件是不放棄已有的鎖,而同時申請新鎖。所以,要想實現(xiàn)死鎖,就會有synchronized的嵌套。
這樣才能同時操作兩個以上的鎖,從而造成死鎖。
總結(jié)
以上就是本文關(guān)于java-synchronized 嵌套使用代碼詳解的全部內(nèi)容,希望對大家有所幫助。
- Java中synchronized實現(xiàn)原理詳解
- java多線程之線程,進程和Synchronized概念初解
- 深入理解java內(nèi)置鎖(synchronized)和顯式鎖(ReentrantLock)
- 聊聊Java并發(fā)中的Synchronized
- Java線程之線程同步synchronized和volatile詳解
- Java編程synchronized與lock的區(qū)別【推薦】
- 解析Java編程之Synchronized鎖住的對象
- java中volatile和synchronized的區(qū)別與聯(lián)系
- 解決Maven 項目報錯 java.httpservlet和synchronized使用方法
- Java synchronized關(guān)鍵_動力節(jié)點Java學(xué)院整理
- 淺析Java多線程同步synchronized
相關(guān)文章
SpringBoot實現(xiàn)接口校驗簽名調(diào)用的項目實踐
在以SpringBoot開發(fā)后臺API接口時,會存在哪些接口不安全的因素呢?通常如何去解決的呢?本文主要介紹了SpringBoot實現(xiàn)接口校驗簽名調(diào)用的項目實踐,感興趣的可以了解一下2023-09-09解決idea導(dǎo)入maven項目缺少jar包的問題方法
這篇文章主要介紹了解決idea導(dǎo)入maven項目缺少jar包的問題,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06解決引用slf4j中Logger.info只打印出文字沒有數(shù)據(jù)的問題
這篇文章主要介紹了解決引用slf4j中Logger.info只打印出文字沒有數(shù)據(jù)的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12關(guān)于IDEA關(guān)聯(lián)數(shù)據(jù)庫的問題
這篇文章主要介紹了IDEA關(guān)聯(lián)數(shù)據(jù)庫的相關(guān)知識,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03Java數(shù)組與二維數(shù)組及替換空格實戰(zhàn)真題講解
數(shù)組對于每一門編程語言來說都是重要的數(shù)據(jù)結(jié)構(gòu)之一,當然不同語言對數(shù)組的實現(xiàn)及處理也不盡相同。Java?語言中提供的數(shù)組是用來存儲固定大小的同類型元素,這篇文章主要介紹了Java數(shù)組與二維數(shù)組及替換空格實戰(zhàn)真題講解2022-07-07Spring AOP面向切面編程實現(xiàn)原理方法詳解
這篇文章主要介紹了Spring AOP面向切面編程實現(xiàn)原理方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08