lockObj.wait()是否會打破鎖,打破原子性?
我加了些注釋,觀察了下。wait的線程在收到notifyAll時,沒有重新競爭鎖,而是從wait()后開始執行的。那么,嚴格來講,是否存在多個線程會同時執行后面代碼的可能?
【本例不會出現是因為每次轉移只轉移給了一個節點,如果轉移給兩個節點或以上。則可能在wait后,同時有兩個節點滿足條件,則會出現競爭的情況?!?/p>
我加了些注釋,觀察了下。wait的線程在收到notifyAll時,沒有重新競爭鎖,而是從wait()后開始執行的。那么,嚴格來講,是否存在多個線程會同時執行后面代碼的可能?
【本例不會出現是因為每次轉移只轉移給了一個節點,如果轉移給兩個節點或以上。則可能在wait后,同時有兩個節點滿足條件,則會出現競爭的情況?!?/p>
2015-12-09
舉報
2015-12-09
不會,主要是這樣的:
先明白兩個概念:鎖池和等待池。synchronized是鎖池,wait、notify、notifyAll是等待池。等待池的對象是不會競爭鎖的,當notifyAll后,等待池中的線程會被喚醒進入到該線程的鎖池中重新競爭對象鎖,重新獲得鎖后的對象會從wait后繼續執行代碼,其他對象會被阻塞,而不是wait。被阻塞的對象會等待下一次被喚醒(notify、notifyAll)。另外,notify不是線程安全的,notifyAll才是。
2015-12-09
確實是沒有重復執行,我在wait后加了個outwait操作,out輸出后加了sleep操作。并驗證了,每個out后面都一定是該線程繼續執行,而沒有出現多個out并排的情況。。說明喚醒的現場還是先做了一次鎖競爭,再執行的。其他的都在競爭外,等待執行?