亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

java嵌套死鎖

2019-11-06 06:51:40
字體:
來源:轉載
供稿:網友

嵌套管程鎖死類似于死鎖, 下面是一個嵌套管程鎖死的場景:

線程1獲得A對象的鎖。線程1獲得對象B的鎖(同時持有對象A的鎖)。線程1決定等待另一個線程的信號再繼續。線程1調用B.wait(),從而釋放了B對象上的鎖,但仍然持有對象A的鎖。線程2需要同時持有對象A和對象B的鎖,才能向線程1發信號。線程2無法獲得對象A上的鎖,因為對象A上的鎖當前正被線程1持有。線程2一直被阻塞,等待線程1釋放對象A上的鎖。線程1一直阻塞,等待線程2的信號,因此,不會釋放對象A上的鎖,而線程2需要對象A上的鎖才能給線程1發信號……

你可以能會說,這是個空想的場景,好吧,讓我們來看看下面這個比較挫的Lock實現:

//lock implementation with nested monitor lockout PRoblem  public class Lock{      protected MonitorObject monitorObject = new MonitorObject();      protected boolean isLocked = false;        public void lock() throws InterruptedException{          synchronized(this){              while(isLocked){                  synchronized(this.monitorObject){                      this.monitorObject.wait();                  }              }              isLocked = true;          }      }        public void unlock(){          synchronized(this){              this.isLocked = false;              synchronized(this.monitorObject){                  this.monitorObject.notify();              }          }      }  }  

可以看到,lock()方法首先在”this”上同步,然后在monitorObject上同步。如果isLocked等于false,因為線程不會繼續調用monitorObject.wait(),那么一切都沒有問題 。但是如果isLocked等于true,調用lock()方法的線程會在monitorObject.wait()上阻塞。

這里的問題在于,調用monitorObject.wait()方法只釋放了monitorObject上的管程對象,而與”this“關聯的管程對象并沒有釋放。換句話說,這個剛被阻塞的線程仍然持有”this”上的鎖。

校對注:如果一個線程持有這種Lock的時候另一個線程執行了lock操作)當一個已經持有這種Lock的線程想調用unlock(),就會在unlock()方法進入synchronized(this)塊時阻塞。這會一直阻塞到在lock()方法中等待的線程離開synchronized(this)塊。但是,在unlock中isLocked變為false,monitorObject.notify()被執行之后,lock()中等待的線程才會離開synchronized(this)塊。

簡而言之,在lock方法中等待的線程需要其它線程成功調用unlock方法來退出lock方法,但是,在lock()方法離開外層同步塊之前,沒有線程能成功執行unlock()。

結果就是,任何調用lock方法或unlock方法的線程都會一直阻塞。這就是嵌套管程鎖死。

一個更現實的例子

你可能會說,這么挫的實現方式我怎么可能會做呢?你或許不會在里層的管程對象上調用wait或notify方法,但完全有可能會在外層的this上調。有很多類似上面例子的情況。例如,如果你準備實現一個公平鎖。你可能希望每個線程在它們各自的QueueObject上調用wait(),這樣就可以每次喚醒一個線程。

下面是一個比較挫的公平鎖實現方式:

//Fair Lock implementation with nested monitor lockout problem  public class FairLock {      private boolean isLocked = false;      private Thread lockingThread = null;      private List waitingThreads =          new ArrayList();        public void lock() throws InterruptedException{          QueueObject queueObject = new QueueObject();            synchronized(this){              waitingThreads.add(queueObject);                while(isLocked ||                  waitingThreads.get(0) != queueObject){                    synchronized(queueObject){                      try{                          queueObject.wait();                      }catch(InterruptedException e){                          waitingThreads.remove(queueObject);                          throw e;                      }                  }              }              waitingThreads.remove(queueObject);              isLocked = true;              lockingThread = Thread.currentThread();          }      }        public synchronized void unlock(){          if(this.lockingThread != Thread.currentThread()){              throw new IllegalMonitorStateException(                  "Calling thread has not locked this lock");          }          isLocked = false;          lockingThread = null;          if(waitingThreads.size() > 0){              QueueObject queueObject = waitingThread.get(0);              synchronized(queueObject){                  queueObject.notify();              }          }      }  }   co

乍看之下,嗯,很好,但是請注意lock方法是怎么調用queueObject.wait()的,在方法內部有兩個synchronized塊,一個鎖定this,一個嵌在上一個synchronized塊內部,它鎖定的是局部變量queueObject。當一個線程調用queueObject.wait()方法的時候,它僅僅釋放的是在queueObject對象實例的鎖,并沒有釋放”this”上面的鎖。

現在我們還有一個地方需要特別注意, unlock方法被聲明成了synchronized,這就相當于一個synchronized(this)塊。這就意味著,如果一個線程在lock()中等待,該線程將持有與this關聯的管程對象。所有調用unlock()的線程將會一直保持阻塞,等待著前面那個已經獲得this鎖的線程釋放this鎖,但這永遠也發生不了,因為只有某個線程成功地給lock()中等待的線程發送了信號,this上的鎖才會釋放,但只有執行unlock()方法才會發送這個信號。

因此,上面的公平鎖的實現會導致嵌套管程鎖死。更好的公平鎖實現方式可以參考Starvation and Fairness。

嵌套管程鎖死 VS 死鎖

嵌套管程鎖死與死鎖很像:都是線程最后被一直阻塞著互相等待。

但是兩者又不完全相同。在死鎖中我們已經對死鎖有了個大概的解釋,死鎖通常是因為兩個線程獲取鎖的順序不一致造成的,線程1鎖住A,等待獲取B,線程2已經獲取了B,再等待獲取A。如死鎖避免中所說的,死鎖可以通過總是以相同的順序獲取鎖來避免。但是發生嵌套管程鎖死時鎖獲取的順序是一致的。線程1獲得A和B,然后釋放B,等待線程2的信號。線程2需要同時獲得A和B,才能向線程1發送信號。所以,一個線程在等待喚醒,另一個線程在等待想要的鎖被釋放。

不同點歸納如下:

死鎖中,二個線程都在等待對方釋放鎖。嵌套管程鎖死中,線程1持有鎖A,同時等待從線程2發來的信號,線程2需要鎖A來發信號給線程1。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美成人精品三级在线观看| 欧美午夜视频在线观看| 午夜欧美不卡精品aaaaa| 91精品一区二区| 欧美影院在线播放| 成人精品久久av网站| 久久久国产视频91| 久久国产精品影视| 日韩精品在线视频美女| 宅男66日本亚洲欧美视频| 色香阁99久久精品久久久| 欧美性xxxxhd| 国产精品视频午夜| 国内精品久久久久久久久| 日韩欧美精品在线观看| 国产欧美一区二区三区在线| 国产日韩在线看| 亚洲最大成人网色| 日韩中文字幕国产精品| 91经典在线视频| 亚洲欧美国产va在线影院| 国产精品吊钟奶在线| 日韩久久免费视频| 自拍偷拍亚洲欧美| 亚洲午夜未满十八勿入免费观看全集| 日韩av片电影专区| 欧美日韩亚洲一区二区三区| 91久久久在线| 黄色一区二区在线观看| www亚洲精品| 国产精品嫩草影院久久久| 国产在线视频2019最新视频| 成人性生交大片免费观看嘿嘿视频| 国产精品免费一区豆花| 57pao国产成人免费| 亚洲色图欧美制服丝袜另类第一页| 91免费国产网站| 成人欧美一区二区三区黑人孕妇| 亚洲精品一区二区网址| 日韩网站免费观看| 亚洲精品影视在线观看| 国内揄拍国内精品少妇国语| 欧美日韩一区二区免费视频| 97久久久免费福利网址| 久久精品国产91精品亚洲| 欧美亚洲国产日韩2020| 欧美日本精品在线| 中文字幕一精品亚洲无线一区| 欧美午夜激情视频| 欧美激情欧美狂野欧美精品| 黄网动漫久久久| 日韩精品视频免费| 日韩女优人人人人射在线视频| 91国内揄拍国内精品对白| 国产激情视频一区| 精品久久久在线观看| 欧美黑人巨大精品一区二区| 欧美裸身视频免费观看| 成人444kkkk在线观看| 中文字幕在线日韩| 成人字幕网zmw| 国产一区欧美二区三区| 日韩动漫免费观看电视剧高清| 在线观看免费高清视频97| 国产69精品久久久久99| 久久国产精品久久久久久久久久| 粗暴蹂躏中文一区二区三区| 91深夜福利视频| 欧美激情亚洲自拍| 亚洲女成人图区| 成人在线视频网| 久久综合网hezyo| 国产日韩换脸av一区在线观看| 亚洲aa中文字幕| 91国语精品自产拍在线观看性色| 国产一区二区三区网站| 国产精品aaaa| 青草青草久热精品视频在线网站| 久久亚洲精品小早川怜子66| 国产精品一区二区久久| 国产香蕉97碰碰久久人人| 亚洲色在线视频| 亚洲成人黄色在线观看| 一区二区三区视频在线| 国产美女扒开尿口久久久| 欧美怡红院视频一区二区三区| 亚洲国产精品热久久| 91高潮在线观看| 中文字幕国内精品| 亚洲人永久免费| 国产欧美日韩最新| 91精品视频在线播放| 91青草视频久久| 国产精品视频xxxx| 日韩av电影国产| 欧美电影在线免费观看网站| 亚洲国产天堂久久综合网| 夜夜嗨av一区二区三区四区| 3344国产精品免费看| 亚洲天堂av电影| 国产精品一区二区三区成人| 主播福利视频一区| 欧美专区中文字幕| 激情久久av一区av二区av三区| 国产噜噜噜噜噜久久久久久久久| 国产日韩欧美夫妻视频在线观看| 黑人与娇小精品av专区| 亚洲天堂av在线免费观看| 亚洲成人精品视频在线观看| 久久久精品国产亚洲| 久久夜色精品国产| 久久av在线看| 精品亚洲一区二区三区| 国产视频亚洲精品| 欧美另类在线观看| 欧美日韩午夜视频在线观看| 欧美午夜影院在线视频| 欧美性20hd另类| 欧美理论电影在线播放| 精品亚洲一区二区三区在线播放| 午夜精品久久久久久久久久久久| 欧美大片网站在线观看| 精品美女久久久久久免费| 色哟哟网站入口亚洲精品| 国产亚洲人成a一在线v站| 免费91麻豆精品国产自产在线观看| 性欧美在线看片a免费观看| 国产一区二区三区在线| 日韩亚洲欧美中文在线| 国产精品一区二区三区久久| 91精品国产成人www| 国产成人亚洲综合91| 色综合伊人色综合网| 亚洲a成v人在线观看| 国产精品久久久999| 亚洲性69xxxbbb| 精品国产拍在线观看| 欧美色图在线视频| 亚洲福利视频免费观看| 狠狠躁天天躁日日躁欧美| 久久久久久成人精品| 久久亚洲精品中文字幕冲田杏梨| 中文字幕不卡av| 欧美性猛交xxxx乱大交极品| 美女999久久久精品视频| 精品成人69xx.xyz| 少妇精69xxtheporn| 亚洲第一视频网| 91精品国产91久久| 欧美日韩福利在线观看| 国产精品免费久久久久久| 亚洲精品xxxx| 国模gogo一区二区大胆私拍| 国产精品入口夜色视频大尺度| 7777kkkk成人观看| 伊人伊成久久人综合网小说| 4k岛国日韩精品**专区| 亚洲码在线观看| 亚洲第一免费播放区| 亚洲欧美日韩一区二区三区在线| 国产成人精品免费视频| 亚洲网站在线观看| 国产欧美日韩精品在线观看| 国产午夜一区二区|