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

Java 多執行緒設計 21 大關鍵要點:從記憶體模型到死鎖防範

     編輯:Java 程式設計入門

記憶體與執行緒狀態

  1. 主記憶體 vs 工作記憶體:JVM 主記憶體(Heap)儲存共享變數;每條執行緒擁有私有工作記憶體(Stack),儲存共享變數副本。volatile 強制讀寫主記憶體,保證可見性。
  2. 六大狀態:Ready、Running、Sleeping、Blocked、Waiting、Dead。CPU 排程順序不確定,需用 setPriority() 輔助控制。

同步與鎖機制

  1. synchronized 實例方法共享 this 鎖;static synchronized 共享 Class 物件鎖。
  2. 所有存取共享關鍵資源的方法必須同步,否則資料競爭必發。
  3. 已知無衝突的方法勿加 synchronized,避免效能損耗。
  4. 若同步方法修改變數,讀取該變數的方法也應同步,確保記憶體可見性。
  5. synchronized 不被繼承:子類別覆寫父類同步方法時,同步語意不會自動保留。

阻塞原因與原子性陷阱

  1. 阻塞來源:I/O 等待、嘗試進入已被鎖定的同步方法。
  2. 基本型別讀寫為原子,但 i = i + 1 包含讀、改、寫三步驟,非原子。long/double 甚至連讀寫都非原子(32 位元 JVM 可能拆兩次)。
  3. 解決方案:將複合操作封裝於同步方法(如 synchronized int read()、synchronized void update())。

進階同步技巧

  1. volatile 適用於單一變數可見性,不保證複合操作原子性。
  2. Thread.yield() 主動讓出 CPU,有時比 sleep() 更有效降低爭用。
  3. wait() 釋放鎖、sleep() 保持鎖;wait() 僅能在同步區塊內呼叫。
  4. 縮小同步區塊範圍,善用 wait(timeout) 避免無限期阻塞。

執行緒通訊與管道

  1. 管道通訊四步驟:建立 PipedWriter/Reader → 連接管道 → 寫入端綁定 Writer → 讀取端綁定 Reader。

死鎖與過時 API

  1. synchronized 最大副作用是死鎖,唯有謹慎設計(固定鎖順序、超時機制、避免巢狀鎖)可防範。
  2. 嚴禁使用 stop()、suspend()、resume()、destroy() —— 已棄用,極易造成資料損壞。
  3. 大量阻塞時,高優先級執行緒優先獲得 CPU。

掌握這 21 項要點,能避開 90% 以上的多執行緒坑,打穩高併發系統地基。

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