首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 多線程基礎:線程間通訊機制詳解

     編輯:Java 相關知識

等待/通知機制

核心方法定義在 java.lang.Object:

  • wait():釋放鎖,進入等待隊列,阻塞直到被通知或中斷
  • notify():喚醒單一等待線程(隨機)
  • notifyAll():喚醒所有等待線程

必須在 synchronized(lock) 同步塊內呼叫,否則拋 IllegalMonitorStateException。

執行流程細節

  1. 線程 A 執行 lock.wait() → 釋放鎖 → 進入等待隊列
  2. 線程 B 取得鎖 → 執行同步塊 → 呼叫 lock.notify()
  3. 線程 B 同步塊結束 → 釋放鎖
  4. 線程 A 從等待隊列移至鎖池 → 競爭鎖 → 獲得鎖 → 繼續執行 wait() 之後代碼

wait vs sleep 對比

特性wait()sleep()
所屬類別ObjectThread
鎖行為釋放鎖持有鎖
喚醒方式notify/notifyAll/超時/中斷時間到/中斷
呼叫前提需持有鎖無限制

進階 API

  • wait(long timeout):超時自動喚醒
  • wait(long timeout, int nanos):納秒級精度
  • notifyAll():避免單一通知導致部分線程永久飢餓

join() 方法 — 線程順序控制

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,易產生死鎖、活鎖、訊號遺失
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved