核心方法定義在 java.lang.Object:
wait():釋放鎖,進入等待隊列,阻塞直到被通知或中斷notify():喚醒單一等待線程(隨機)notifyAll():喚醒所有等待線程必須在 synchronized(lock) 同步塊內呼叫,否則拋 IllegalMonitorStateException。
lock.wait() → 釋放鎖 → 進入等待隊列lock.notify()wait() 之後代碼| 特性 | wait() | sleep() |
|---|---|---|
| 所屬類別 | Object | Thread |
| 鎖行為 | 釋放鎖 | 持有鎖 |
| 喚醒方式 | notify/notifyAll/超時/中斷 | 時間到/中斷 |
| 呼叫前提 | 需持有鎖 | 無限制 |
wait(long timeout):超時自動喚醒wait(long timeout, int nanos):納秒級精度notifyAll():避免單一通知導致部分線程永久飢餓thread.join() 使當前線程阻塞,直到目標線程終止。底層實現:
public final synchronized void join(long millis) {
while (isAlive()) {
wait(millis); // 釋放鎖等待
}
}
JVM 在線程終止時自動執行 native notifyAll(),原始碼不可見。
while 迴圈而非 if 中檢查條件(防止虛假喚醒)java.util.concurrent 高層工具(CountDownLatch、CyclicBarrier、BlockingQueue)wait/notify,易產生死鎖、活鎖、訊號遺失