當多個線程共享同一把鎖對象時,透過 wait()、notify()、notifyAll() 可實現線程間的協作與同步。典型場景:生產者-消費者模型、線程順序執行控制。
| 方法 | 行為 | 鎖狀態 |
|---|---|---|
wait() | 當前線程進入等待集,釋放鎖 | 釋放 |
notify() | 隨機喚醒一個等待線程,移入鎖池 | 持有 |
notifyAll() | 喚醒所有等待線程,全部移入鎖池 | 持有 |
Object lock = new Object();
class ThreadA extends Thread {
private final Object lock;
ThreadA(Object lock) { this.lock = lock; }
public void run() {
synchronized (lock) {
for (int i = 0; i < 10; i++) {
System.out.println(getName() + "---" + i);
if (i == 5) {
try { lock.wait(); }
catch (InterruptedException e) { e.printStackTrace(); }
}
}
}
}
}
class ThreadB extends Thread {
private final Object lock;
ThreadB(Object lock) { this.lock = lock; }
public void run() {
synchronized (lock) {
for (int i = 0; i < 10; i++) {
System.out.println(getName() + "---" + i);
if (i == 2) lock.notify();
}
}
}
}
public static void main(String[] args) {
Object lock = new Object();
new ThreadA(lock).start();
new ThreadB(lock).start();
}
A---0 ... A---5 B---0 B---1 B---2 ← notify() 喚醒 A B---3 ... B---9 ← B 持有鎖繼續跑完 A---6 ... A---9 ← B 釋放鎖後 A 獲取鎖繼續
while 而非 if 判斷條件,防止虛假喚醒Java 5+ 推薦使用 java.util.concurrent 套件:
BlockingQueue 實現生產消費CountDownLatch/CyclicBarrier 控制執行順序Condition 替代 wait/notify,支援多條件隊列理解 wait/notify 底層機制,有助於排查併發 Bug 與閱讀框架源碼。