wait() 和 notify() 的一個疑問
阿新 • • 發佈:2018-12-21
相關部落格:
併發程式設計學習之wait()和notify()
在 wati()
方法中有這樣一段描述:
public final native void wait(long timeout) throws InterruptedException;
- This method causes the current thread (call it T) to
- place itself in the wait set for this object and then to relinquish
- any and all synchronization claims on this object. Thread T
- becomes disabled for thread scheduling purposes and lies dormant
- until one of four things happens:
有一個很關鍵的地方是 wati()
方法會釋放持有的 synchronized
的 monitor
,那麼當被 wait()
後的執行緒被 notify()
後肯定需要再重新獲取 synchronized
的 monitor
(因為 wait()
必須要在 synchronized
中嘛),那麼會從頭到尾執行一次 synchronized
中的程式碼嗎?先看這樣一段程式碼:
package com.example.demoClient;
/**
* @author Dongguabai
* @date 2018/12/14 17:47
*/
public class Demo {
private static final Object LOKC = new Object();
private static void doSth(){
System.out.println("開始工作了-------");
synchronized (LOKC){
System.out.println("準備 wait 了---");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("執行結束----");
}
}
public static void main(String[] args) throws InterruptedException {
new Thread(){
@Override
public void run() {
doSth();
}
}.start();
Thread.sleep(1500);
synchronized (LOKC){
LOKC.notify();
}
}
}
輸出結果:
當 new
的 Thread
被喚醒後雖然需要重新獲取鎖,但是並沒有再次輸出“準備 wait 了”,即沒有再從頭到尾執行一次 synchronized
中的程式碼。