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

Java 多線程核心機制深度解析:同步、通信與狀態控制

     編輯:Java 相關知識

線程啟動:run() vs start()

run() 只是普通方法調用,不會開啟新線程;必須調用 start() 才會由 JVM 安排線程並發執行。run() 必須為 public void、無參數,這是實現 Runnable 介面的契約。

關鍵字 synchronized 與鎖機制

synchronized 保護的是共享數據。核心原理:每個對象有一把內部鎖。線程進入同步代碼塊/方法前必須獲取鎖,退出時釋放鎖。

同步方法 vs 同步代碼塊

  • 同步實例方法:鎖住 this 對象
  • 同步靜態方法:鎖住 Class 對象
  • 同步代碼塊:synchronized(obj) { ... },鎖住指定對象,建議縮小鎖範圍以提高併發度

經典誤區演示

兩個不同 Runnable 實例啟動的線程,即使 run() 加了 synchronized,也無法同步,因為鎖的是不同對象。只有共享同一個Runnable 實例的線程才能互斥執行。

線程休眠:sleep()

  • 使當前線程暫停指定毫秒數
  • 不釋放鎖(若在同步塊中)
  • 拋出 InterruptedException,需捕獲處理
  • 可讓低優先級線程獲得執行機會

線程合併:join()

調用 t.join() 會阻塞當前線程,直到線程 t 結束。常用於主線程等待子線程完成後再繼續。

線程讓步:yield()

  • 當前線程主動放棄 CPU,回到就緒狀態
  • 只能讓同優先級線程獲得機會
  • 不保證一定讓步,視 JVM 實現而定

線程通信:wait() / notify() / notifyAll()

這三個方法屬於 Object 類,**必須在同步塊/方法中調用**。

  • wait():釋放鎖,進入對象的等待集
  • notify():喚醒等待集中任意一個線程,移至鎖池
  • notifyAll():喚醒等待集中所有線程
  • 喚醒後需重新獲取鎖才能繼續執行

生產者-消費者模式範例

synchronized(lock) {
    while (queue.isEmpty()) lock.wait(); // 條件不滿足則等待
    // 消費數據
    lock.notifyAll(); // 通知生產者
}

線程狀態與調度

Java 線程生命週期:NEW → RUNNABLE → BLOCKED/WAITING/TIMED_WAITING → TERMINATED。

  • JVM 調度為搶佔式優先級調度
  • 高優先級線程可搶佔低優先級
  • 同優先級不保證時間片輪轉,視作業系統而定
  • 不應依賴時間片編寫程序,應用 yield() 協作

最佳實踐建議

  1. 優先實現 Runnable 介面,而非繼承 Thread 類
  2. 縮小同步範圍,避免死鎖
  3. 使用 wait/notify 時必須用 while 循環檢查條件,防止虛假喚醒
  4. JDK 1.2 後棄用 stop()、suspend()、resume(),請用中斷標誌位
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved