最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java-synchronized 嵌套使用代碼詳解

 更新時(shí)間:2017年09月19日 10:27:33   作者:yokasou  
本文以synchronized 的同步造成了死鎖為例,介紹了java-synchronized 嵌套使用代碼詳解,同時(shí)對(duì)鎖和死鎖的概念進(jìn)行了說明,需要的朋友可以了解下。

當(dāng)synchronized使用過多時(shí),可能會(huì)造成死鎖,那么死鎖到底是怎么一回事呢。先看下面的代碼,實(shí)現(xiàn)死鎖

//死鎖的實(shí)現(xiàn)
classA
{
publicvoidget(){
System.out.println("A說:我開始啟動(dòng)了,B,給我你的資源");
}
publicvoidsay(){
System.out.println("A獲得資源");
}
}
classB
{
publicvoidget(){
System.out.println("B說:我開始啟動(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è)線程同時(shí)等待對(duì)方的完成,而程序無法繼續(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è)線程對(duì)象執(zhí)行被保護(hù)的代碼

在以上代碼中,在線程th1啟動(dòng)后,他就獲得了a的鎖,同時(shí)當(dāng)其休眠完畢,求會(huì)申請(qǐng)獲得b的鎖,而此時(shí),他的a鎖沒有放棄。在線程th2啟動(dòng)后,他就獲得了b的鎖,同時(shí)當(dāng)其休眠完畢,求會(huì)申請(qǐng)獲得a的鎖,而此時(shí),他的b鎖沒有放棄。

兩方都握有自己的鎖不放棄,而同時(shí)申請(qǐng)另一方的鎖,所以,此時(shí)就造成了死鎖。

同步,同步的就是線程和對(duì)象,將線程和對(duì)象進(jìn)行綁定,獲取對(duì)象的鎖。

注意:通過以上代碼可以發(fā)現(xiàn),死鎖的必要條件是不放棄已有的鎖,而同時(shí)申請(qǐng)新鎖。所以,要想實(shí)現(xiàn)死鎖,就會(huì)有synchronized的嵌套。

這樣才能同時(shí)操作兩個(gè)以上的鎖,從而造成死鎖。

總結(jié)

以上就是本文關(guān)于java-synchronized 嵌套使用代碼詳解的全部?jī)?nèi)容,希望對(duì)大家有所幫助。

相關(guān)文章

  • SpringMVC中的DispatcherServlet詳細(xì)解析

    SpringMVC中的DispatcherServlet詳細(xì)解析

    這篇文章主要介紹了SpringMVC中的DispatcherServlet詳細(xì)解析,DispatcherServlet也是一個(gè)Servlet,它也能通過Servlet的API來響應(yīng)請(qǐng)求,從而成為一個(gè)前端控制器,Web容器會(huì)調(diào)用Servlet的doGet()以及doPost()等方法,需要的朋友可以參考下
    2023-12-12
  • 淺談Spring的兩種事務(wù)定義方式

    淺談Spring的兩種事務(wù)定義方式

    下面小編就為大家?guī)硪黄獪\談Spring的兩種事務(wù)定義方式。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-10-10
  • java N皇后實(shí)現(xiàn)問題解析

    java N皇后實(shí)現(xiàn)問題解析

    將 n 個(gè)皇后擺放在一個(gè) n x n 的棋盤上,使得每一個(gè)皇后都無法攻擊到其他皇后,N皇后問題是一個(gè)典型的約束求解問題,利用遞歸機(jī)制,可以很快的得到結(jié)果,本文將詳細(xì)介紹,需要了解的朋友可以參考下
    2012-11-11
  • Springboot之restTemplate配置及使用方式

    Springboot之restTemplate配置及使用方式

    這篇文章主要介紹了Springboot之restTemplate配置及使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • 解析HikariCP一百行代碼輕松掌握多線程

    解析HikariCP一百行代碼輕松掌握多線程

    這篇文章主要為大家介紹了HikariCP一百行代碼解析,輕松掌握多線程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • 通過實(shí)例了解java spring使用構(gòu)造器注入的原因

    通過實(shí)例了解java spring使用構(gòu)造器注入的原因

    這篇文章主要介紹了通過實(shí)例了解spring使用構(gòu)造器注入的原因,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • java序列化與反序列化操作實(shí)例分析

    java序列化與反序列化操作實(shí)例分析

    這篇文章主要介紹了java序列化與反序列化操作,結(jié)合實(shí)例形式分析了java序列化與反序列化的概念與具體實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2016-10-10
  • SpringBoot 防御 CSRF 攻擊的流程及原理解析

    SpringBoot 防御 CSRF 攻擊的流程及原理解析

    CSRF是一種非常常見的Web攻擊方式,其實(shí)是很好防御的,但是由于經(jīng)常被很多開發(fā)者忽略,進(jìn)而導(dǎo)致很多網(wǎng)站實(shí)際上都存在 CSRF 攻擊的安全隱患,這篇文章主要介紹了SpringBoot 如何防御 CSRF 攻擊,需要的朋友可以參考下
    2023-05-05
  • SpringBoot使用jasypt實(shí)現(xiàn)數(shù)據(jù)庫信息脫敏的方法詳解

    SpringBoot使用jasypt實(shí)現(xiàn)數(shù)據(jù)庫信息脫敏的方法詳解

    這篇文章主要介紹了SpringBoot使用jasypt實(shí)現(xiàn)數(shù)據(jù)庫信息的脫敏,以此來保護(hù)數(shù)據(jù)庫的用戶名username和密碼password(容易上手,詳細(xì)),文中有詳細(xì)的圖文講解和代碼示例供大家參考,需要的朋友可以參考下
    2024-06-06
  • Java?InputStream實(shí)戰(zhàn)之輕松讀取操作文件流

    Java?InputStream實(shí)戰(zhàn)之輕松讀取操作文件流

    在Java中,輸入輸出是非常重要的基礎(chǔ)功能,其中,InputStream是Java中的一個(gè)重要輸入流類,用于從輸入源讀取數(shù)據(jù),下面我們就來學(xué)習(xí)一下InputStream類的相關(guān)知識(shí)吧
    2023-10-10

最新評(píng)論

临夏市| 沂源县| 临海市| 南宁市| 德保县| 凤冈县| 古浪县| 古浪县| 忻城县| 南昌县| 顺平县| 葵青区| 新源县| 呈贡县| 南江县| 礼泉县| 习水县| 醴陵市| 肇东市| 平凉市| 永定县| 林芝县| 鄂托克旗| 和静县| 贞丰县| 利辛县| 稻城县| 镇宁| 通河县| 南澳县| 阿尔山市| 八宿县| 夏河县| 斗六市| 诸城市| 长垣县| 司法| 磴口县| 海阳市| 辽源市| 大港区|