wait():當前線程釋放對象鎖,進入對象等待隊列,阻塞直至被喚醒或中斷。notify():隨機喚醒對象等待隊列中**一個**線程(優先級高者機率大),喚醒後需重新獲取鎖才能繼續執行。notifyAll():喚醒**所有**等待隊列線程,競爭鎖執行。關鍵點: 調用前必須持有對象鎖(在 synchronized 塊內),否則拋 IllegalMonitorStateException。

wait() → 釋放鎖,進入 Wait Set。notify() → 從 Wait Set 移出線程 A,進入 Entry Set 競爭鎖。wait() 後代碼。public class WaitNotifyDemo {
private static final Object lock = new Object();
private static boolean hasData = false;
public static void main(String[] args) {
new Thread(() -> {
synchronized (lock) {
System.out.println(Thread.currentThread().getName() + " 開始等待...");
try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); }
System.out.println(Thread.currentThread().getName() + " 被喚醒,繼續執行");
}
}, "Waiter").start();
new Thread(() -> {
synchronized (lock) {
System.out.println(Thread.currentThread().getName() + " 發送通知");
lock.notify();
try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); }
System.out.println(Thread.currentThread().getName() + " 釋放鎖");
}
}, "Notifier").start();
}
}
1473306408730:Waiter 開始等待...
1473306408731:Notifier 發送通知
1473306418731:Waiter 被喚醒,繼續執行
Waiter 在 Notifier 調用 notify() 後**並未立即執行**,而是等待 Notifier 釋放鎖(睡眠 10 秒後),證明 notify 僅移出等待隊列,不釋放鎖。
while (!condition) lock.wait(); 防止虛假喚醒。final Object lock = new Object(); 專用鎖,避免業務對象鎖衝突。ReentrantLock.newCondition() 支持多條件隊列,精準喚醒,性能更優。