全面梳理 Java 線程安全實現機制與《Effective Java》條目 52 定義的五級線程安全分類,附代碼範例與管道通訊模式。
public synchronized void method() { ... } // 鎖 this
synchronized (objectReference) { /* 臨界區 */ }
public static synchronized void method() { ... } // 鎖 Class 物件
synchronized (ClassName.class) { /* 臨界區 */ }
synchronized method() 鎖的是物件而非方法本身class MyLock {
private final Object lock = new Object();
public void atomicTwoStep() {
synchronized (lock) {
step1();
step2(); // 保證 step1、step2 不被打斷
}
}
}
String、Integer、final 欄位物件java.util.Timer、ConcurrentHashMapVector、Hashtable(遍歷時需鎖定)ArrayList、HashMap(配合 Collections.synchronizedList)System.runFinalizersOnExit()(已棄用)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 遍歷輸出順序非預期 → 非線程安全特性,非 BugLinkedHashMap 或外部同步 + ArrayList 記錄順序