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

Java 線程安全四大實現方式與五級安全分類

     編輯:Java 相關知識

全面梳理 Java 線程安全實現機制與《Effective Java》條目 52 定義的五級線程安全分類,附代碼範例與管道通訊模式。

四種同步實現方式

1. 實例方法同步

public synchronized void method() { ... } // 鎖 this

2. 同步區塊(指定鎖物件)

synchronized (objectReference) { /* 臨界區 */ }

3. 靜態方法同步

public static synchronized void method() { ... } // 鎖 Class 物件

4. 類別鎖區塊

synchronized (ClassName.class) { /* 臨界區 */ }

關鍵區別

  • 方式 1、2 鎖 實例:同一實例的不同同步方法互斥
  • 方式 3、4 鎖 類別:所有實例共享同一把鎖
  • synchronized method() 鎖的是物件而非方法本身

跨方法原子操作模式

class MyLock {
    private final Object lock = new Object();
    public void atomicTwoStep() {
        synchronized (lock) {
            step1();
            step2(); // 保證 step1、step2 不被打斷
        }
    }
}

五級線程安全分類 (Effective Java Item 52)

  1. Immutable (不可變):建構後狀態永不改變,天然線程安全。
    例:String、Integer、final 欄位物件
  2. Thread-Safe (無條件線程安全):內部同步,客戶端無需額外措施。
    例:java.util.Timer、ConcurrentHashMap
  3. Conditionally Thread-Safe (條件線程安全):單獨方法安全,但複合操作需外部同步。
    例:Vector、Hashtable(遍歷時需鎖定)
  4. Thread-Compatible (線程相容):非線程安全,但客戶端可用同步包裝器安全使用。
    例:ArrayList、HashMap(配合 Collections.synchronizedList)
  5. Thread-Hostile (線程敵對):即使外部同步也無法安全使用。
    例:System.runFinalizersOnExit()(已棄用)

wait/notifyAll 最佳實踐

  • 永遠在 while 迴圈中呼叫 wait(),防止虛假喚醒
  • 優先使用 notifyAll() 而非 notify(),避免信號遺失

管道通訊:生產者-消費者模式

四大管道類:PipedInputStream、PipedReader、PipedOutputStream、PipedWriter

/* 建立管道 */
PipedOutputStream pout1 = new PipedOutputStream();
PipedInputStream pin1 = new PipedInputStream(pout1);
PipedOutputStream pout2 = new PipedOutputStream();
PipedInputStream pin2 = new PipedInputStream(pout2);

/* 構建線程鏈 */
Producer prod = new Producer(pout1);
Filter filt = new Filter(pin1, pout2);
Consumer cons = new Consumer(pin2);

/* 啟動 */
prod.start(); filt.start(); cons.start();

資料流向:Producer → Filter → Consumer,各階段獨立線程,管道自動阻塞協調速率。

常見問題與對策

  • Hashtable 遍歷輸出順序非預期 → 非線程安全特性,非 Bug
  • 需保持插入順序 → 改用 LinkedHashMap 或外部同步 + ArrayList 記錄順序
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved