亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

lockObj.wait()是否會打破鎖,打破原子性?

http://img1.sycdn.imooc.com//566780920001874810490447.jpg

我加了些注釋,觀察了下。wait的線程在收到notifyAll時,沒有重新競爭鎖,而是從wait()后開始執行的。那么,嚴格來講,是否存在多個線程會同時執行后面代碼的可能?

【本例不會出現是因為每次轉移只轉移給了一個節點,如果轉移給兩個節點或以上。則可能在wait后,同時有兩個節點滿足條件,則會出現競爭的情況?!?/p>

正在回答

2 回答

不會,主要是這樣的:

先明白兩個概念:鎖池和等待池。synchronized是鎖池,wait、notify、notifyAll是等待池。等待池的對象是不會競爭鎖的,當notifyAll后,等待池中的線程會被喚醒進入到該線程的鎖池中重新競爭對象鎖,重新獲得鎖后的對象會從wait后繼續執行代碼,其他對象會被阻塞,而不是wait。被阻塞的對象會等待下一次被喚醒(notify、notifyAll)。另外,notify不是線程安全的,notifyAll才是。

0 回復 有任何疑惑可以回復我~

確實是沒有重復執行,我在wait后加了個outwait操作,out輸出后加了sleep操作。并驗證了,每個out后面都一定是該線程繼續執行,而沒有出現多個out并排的情況。。說明喚醒的現場還是先做了一次鎖競爭,再執行的。其他的都在競爭外,等待執行?


1 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

lockObj.wait()是否會打破鎖,打破原子性?

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號