區域變數不可見於其他執行緒;物件在堆上對所有持有參考的執行緒可見。
JMM 規範變數何時在執行緒間可見,對應硬體的快取一致性協定 (MESI 等)。
執行緒 A 修改堆上物件,未刷新至主記憶體前,執行緒 B 讀取舊值。
// 解決:volatile 強制讀寫主記憶體
volatile int count = 0;
多執行緒同時讀修寫同一變數 (如 count++ 非原子)。
// 解決:synchronized 互斥 + 記憶體屏障
synchronized(lock) { count++; }
volatile int i; i++; 仍非原子| 場景 | 推薦方案 |
|---|---|
| 單一旗標/狀態 | volatile boolean flag |
| 計數器/複雜邏輯 | AtomicInteger / synchronized / Lock |
| 高併發讀多寫少 | ReadWriteLock / StampedLock |
| 無鎖演算法 | CAS (compareAndSet) / AtomicReference |