java-synchronized 嵌套使用代碼詳解
當(dāng)synchronized使用過(guò)多時(shí),可能會(huì)造成死鎖,那么死鎖到底是怎么一回事呢。先看下面的代碼,實(shí)現(xiàn)死鎖:
//死鎖的實(shí)現(xiàn) classA { publicvoidget(){ System.out.println("A說(shuō):我開(kāi)始啟動(dòng)了,B,給我你的資源"); } publicvoidsay(){ System.out.println("A獲得資源"); } } classB { publicvoidget(){ System.out.println("B說(shuō):我開(kāi)始啟動(dòng)了,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 的同步造成了死鎖,死鎖是兩個(gè)或多個(gè)線(xiàn)程同時(shí)等待對(duì)方的完成,而程序無(wú)法繼續(xù)執(zhí)行。在解釋代碼前,首先要明白synchronized到底是怎么一回事。synchronized 定義同步,那么同步的什么,什么和什么同步了?
首先,我們得知道,什么是鎖。在java中,每一個(gè)對(duì)象都有一個(gè)內(nèi)部鎖,如果以方法或代碼塊用 synchronized 進(jìn)行聲明,那么對(duì)象的鎖將保護(hù)整個(gè)方法或代碼塊,要調(diào)用這個(gè)方法或者執(zhí)行這個(gè)代碼塊,必須獲得這個(gè)對(duì)象的鎖。而且,任何時(shí)候都只能有一個(gè)線(xiàn)程對(duì)象執(zhí)行被保護(hù)的代碼
在以上代碼中,在線(xiàn)程th1啟動(dòng)后,他就獲得了a的鎖,同時(shí)當(dāng)其休眠完畢,求會(huì)申請(qǐng)獲得b的鎖,而此時(shí),他的a鎖沒(méi)有放棄。在線(xiàn)程th2啟動(dòng)后,他就獲得了b的鎖,同時(shí)當(dāng)其休眠完畢,求會(huì)申請(qǐng)獲得a的鎖,而此時(shí),他的b鎖沒(méi)有放棄。
兩方都握有自己的鎖不放棄,而同時(shí)申請(qǐng)另一方的鎖,所以,此時(shí)就造成了死鎖。
同步,同步的就是線(xiàn)程和對(duì)象,將線(xiàn)程和對(duì)象進(jìn)行綁定,獲取對(duì)象的鎖。
注意:通過(guò)以上代碼可以發(fā)現(xiàn),死鎖的必要條件是不放棄已有的鎖,而同時(shí)申請(qǐng)新鎖。所以,要想實(shí)現(xiàn)死鎖,就會(huì)有synchronized的嵌套。
這樣才能同時(shí)操作兩個(gè)以上的鎖,從而造成死鎖。
總結(jié)
以上就是本文關(guān)于java-synchronized 嵌套使用代碼詳解的全部?jī)?nèi)容,希望對(duì)大家有所幫助。
- Java中synchronized實(shí)現(xiàn)原理詳解
- java多線(xiàn)程之線(xiàn)程,進(jìn)程和Synchronized概念初解
- 深入理解java內(nèi)置鎖(synchronized)和顯式鎖(ReentrantLock)
- 聊聊Java并發(fā)中的Synchronized
- Java線(xiàn)程之線(xiàn)程同步synchronized和volatile詳解
- Java編程synchronized與lock的區(qū)別【推薦】
- 解析Java編程之Synchronized鎖住的對(duì)象
- java中volatile和synchronized的區(qū)別與聯(lián)系
- 解決Maven 項(xiàng)目報(bào)錯(cuò) java.httpservlet和synchronized使用方法
- Java synchronized關(guān)鍵_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- 淺析Java多線(xiàn)程同步synchronized
相關(guān)文章
SpringMVC中的DispatcherServlet詳細(xì)解析
這篇文章主要介紹了SpringMVC中的DispatcherServlet詳細(xì)解析,DispatcherServlet也是一個(gè)Servlet,它也能通過(guò)Servlet的API來(lái)響應(yīng)請(qǐng)求,從而成為一個(gè)前端控制器,Web容器會(huì)調(diào)用Servlet的doGet()以及doPost()等方法,需要的朋友可以參考下2023-12-12
java N皇后實(shí)現(xiàn)問(wèn)題解析
將 n 個(gè)皇后擺放在一個(gè) n x n 的棋盤(pán)上,使得每一個(gè)皇后都無(wú)法攻擊到其他皇后,N皇后問(wèn)題是一個(gè)典型的約束求解問(wèn)題,利用遞歸機(jī)制,可以很快的得到結(jié)果,本文將詳細(xì)介紹,需要了解的朋友可以參考下2012-11-11
Springboot之restTemplate配置及使用方式
這篇文章主要介紹了Springboot之restTemplate配置及使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04
通過(guò)實(shí)例了解java spring使用構(gòu)造器注入的原因
這篇文章主要介紹了通過(guò)實(shí)例了解spring使用構(gòu)造器注入的原因,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
SpringBoot使用jasypt實(shí)現(xiàn)數(shù)據(jù)庫(kù)信息脫敏的方法詳解
這篇文章主要介紹了SpringBoot使用jasypt實(shí)現(xiàn)數(shù)據(jù)庫(kù)信息的脫敏,以此來(lái)保護(hù)數(shù)據(jù)庫(kù)的用戶(hù)名username和密碼password(容易上手,詳細(xì)),文中有詳細(xì)的圖文講解和代碼示例供大家參考,需要的朋友可以參考下2024-06-06
Java?InputStream實(shí)戰(zhàn)之輕松讀取操作文件流
在Java中,輸入輸出是非常重要的基礎(chǔ)功能,其中,InputStream是Java中的一個(gè)重要輸入流類(lèi),用于從輸入源讀取數(shù)據(jù),下面我們就來(lái)學(xué)習(xí)一下InputStream類(lèi)的相關(guān)知識(shí)吧2023-10-10

