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

Java 多執行緒程式設計 23 條核心要點總覽

     編輯:J2EE

記憶體模型與執行緒狀態

  1. 主記憶體 vs 工作記憶體: JVM 主記憶體儲存共享變數,各執行緒擁有私有工作記憶體(對應 Stack/Heap),資料同步需透過 volatile 或同步機制。
  2. 五大狀態: Ready(就緒)、Running(執行)、Sleeping(睡眠)、Blocked(阻塞)、Waiting(等待)。
  3. 執行順序不確定: CPU 排程順序非建立順序,需以 setPriority() 或同步工具干預。

同步與鎖機制

  1. 共享資源必須同步: 多執行緒存取同一資源需 synchronized。
  2. 執行緒註冊機制: 執行緒持有自身參考,GC 無法回收存活執行緒。
  3. Daemon 執行緒: 主程式結束即強制終止,適合背景服務。
  4. 物件鎖: 同一物件的所有 synchronized 方法共享一把鎖;static synchronized 鎖定 Class 物件。
  5. 關鍵方法全同步: 存取共享資源的所有方法皆需 synchronized,否則資料競爭風險。
  6. 避免過度同步: 確定無衝突時省略 synchronized 可提升效能。
  7. 讀取被修改的共享變數: 讀取端也應同步,確保可見性。
  8. 同步不可繼承: 父類別同步方法,子類別覆寫時不自動同步,需重新加註解。

阻塞原因與原子性陷阱

  1. 阻塞成因: (1) I/O 等待 (2) 嘗試呼叫已被鎖定物件的同步方法。
  2. 原子操作限制: 基本型別讀寫(long/double 除外)是原子的,但 i = i + 1 包含讀-改-寫三步,非原子,多執行緒下會競爭。
  3. 解決方案: 將讀寫方法皆設為 synchronized,或使用 AtomicInteger 等原子類別。

進階關鍵字與工具

  1. volatile: 保證變數與主記憶體一致,操作具原子性,適用於 long/double 或旗標變數。
  2. yield() vs sleep(): yield() 主動讓出 CPU,無指定時間,有時比睡眠更高效。
  3. wait() vs sleep(): wait() 釋放鎖,需在同步區塊內呼叫;sleep() 不釋放鎖。
  4. 縮小同步範圍: 善用同步區塊、wait(timeout) 避免無限等待。

執行緒通訊與死鎖

  1. 管道通訊: PipedWriter/PipedReader 實現執行緒間即時資料流傳遞。
  2. 死鎖風險: synchronized 最大缺點是易導致死鎖,唯有謹慎設計避免(固定鎖順序、嘗試鎖、超時機制)。
  3. 棄用方法: 切勿使用 stop()、suspend()、resume()、destroy(),極易破壞資料一致性。

效能調優建議

  1. 優先級高者機率較大執行,但低優先級仍可能執行。
  2. 執行緒組管理優勢:單一指令操作整組,但實務較少使用。
  3. 效能優化三原則: (1) 檢查阻塞點,多用 sleep/yield/wait (2) 延長睡眠時間 (3) 執行緒數控制在 100 以內,視平台/JVM 差異調整。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved