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

Java 多線程程式設計核心要點總結

     編輯:Java 相關知識

前言

Java 多線程是高併發程式設計的基石,但也充滿陷阱。本文彙整 23 條核心知識點,涵蓋記憶體模型、線程狀態、同步機制、效能優化等,助你構建正確、高效的併發程式。

核心知識點

1. 記憶體模型:主記憶體 vs 工作記憶體

JVM 將共享變量存於主記憶體(堆),每條線程擁有私有工作記憶體(棧幀區),操作共享變量時需經「讀取→載入→運算→存儲→寫回」步驟,volatile 可保證可見性。

2. 線程六大狀態

NEW → RUNNABLE(Ready/Running) → BLOCKED(鎖等待) → WAITING/TIMED_WAITING(wait/sleep/join) → TERMINATED。

3. 執行順序不確定,需手動干預

線程啟動順序 ≠ 執行順序。若需控制,可用 setPriority()、join()、CountDownLatch 等同步工具。

4. 共享資源訪問必須同步

多線程讀寫同一變量時,需用 synchronized、Lock、原子類等保護,否則會出現競態條件。

5. 線程對象持有引用,影響 GC

未終止的線程會被線程組/執行緒池引用,導致無法被垃圾回收,長時間運行的應用需注意線程洩漏。

6. 守護線程特性

setDaemon(true) 標記的線程,在所有非守護線程結束時 JVM 自動退出,適合後台輔助任務(如 GC、定時清理)。

7. 鎖的粒度與範圍

  • 實例方法 synchronized 鎖 this。
  • 靜態方法 synchronized 鎖 Class 對象。
  • 同步代碼塊可指定任意對象為鎖,建議縮小同步範圍提升併發度。

8. 所有訪問共享資源的方法必須同步

「一處同步,處處同步」,否則保護失效。

9. 避免過度同步

確認無衝突的操作(如唯讀、線程局部變量)不加鎖,減少上下文切換開銷。

10. 讀寫同步一致性

若寫方法已同步,讀方法也應同步,否則可能讀到舊值(缺乏 happens-before 關係)。

11. synchronized 不可繼承

子類重寫父類同步方法時,同步修飾符不會自動繼承,需顯式添加。

12. 線程阻塞常見原因

  • I/O 等待(read()、accept())。
  • 嘗試獲取被佔用的對象鎖(進入 BLOCKED)。
  • 呼叫 wait()、sleep()、join()。

13. 原子操作陷阱:i++ 非原子

i = i + 1 包含讀取、修改、寫回三步,多線程下會丟失更新。long/double 非 volatile 時甚至連讀寫都非原子。

14. 解決方案:封裝同步存取器

class Counter extends Thread {
    private int i;
    public synchronized int read() { return i; }
    public synchronized void increment() { i++; }
}

或使用 AtomicInteger、LongAdder 等無鎖類。

15. volatile 關鍵字

保證讀寫直接作用於主記憶體,適用於狀態標記、單次寫入多次讀取場景,但不保證複合操作原子性。

16. yield() 主動讓出 CPU

僅讓同優先級線程有機會執行,不釋放鎖,適合計算密集型任務主動插隊。

17. sleep() vs wait()

特性sleep()wait()
所屬類ThreadObject
釋放鎖否是
喚醒方式時間到/中斷notify()/notifyAll()/中斷
調用前提任意位置必須在同步塊/方法中

18. 縮小同步範圍,善用 wait(timeout)

帶超時的 wait 可避免無限期阻塞,配合 notifyAll() 防止信號遺漏。

19. 管道實現線程實時通訊

PipedWriter out = new PipedWriter();
PipedReader in = new PipedReader(out);
// 生產者寫 out,消費者讀 in

20. 死鎖預防

  • 固定鎖獲取順序。
  • 使用 tryLock(timeout) 避免無限等待。
  • 避免在同步塊中呼叫外部方法。
  • 禁用 stop()、suspend()、resume()、destroy()(已棄用)。

21. 優先級調度特性

高優先級線程獲得更多 CPU 時間片,但低優先級不會餓死(時間片輪轉)。

22. 線程組用途有限

主要提供批量操作(interrupt()、setDaemon()),現代開發較少直接使用。

23. 效能優化清單

  • 檢查所有阻塞點,優先用 wait/sleep/yield 釋放 CPU。
  • 適當增加 sleep 時間減少輪詢頻率。
  • 線程數控制在百級以內,避免上下文切換風暴。
  • 不同 OS/JVM 表現差異大,需實測調優。

總結

掌握上述要點,能讓你在面對複雜併發場景時,從容選擇正確的同步策略、避開常見坑洞,編寫出穩健高效的多線程程式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved