1. 程式人生 > >wait() 和 notify() 的一個疑問

wait() 和 notify() 的一個疑問

相關部落格:
併發程式設計學習之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() 方法會釋放持有的 synchronizedmonitor,那麼當被 wait() 後的執行緒被 notify() 後肯定需要再重新獲取 synchronizedmonitor(因為 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(); } } }

輸出結果:
在這裡插入圖片描述
newThread 被喚醒後雖然需要重新獲取鎖,但是並沒有再次輸出“準備 wait 了”,即沒有再從頭到尾執行一次 synchronized 中的程式碼。