volatile int i; i++; 非原子操作!class Counter {
volatile int count = 0;
void increment() { count++; } // 非原子!
}
// 100 執行緒各增 1000 次,結果 < 100000
// 原因:count++ = 讀取 → 加一 → 寫入,中間可被打斷
CPU 硬體指令:cmpxchg (x86)、ldrex/strex (ARM)。
// 邏輯:若記憶體值 == 預期值,則設為新值,否則失敗
boolean compareAndSet(int expect, int update) {
// 原子執行,無需鎖
}
// 基本型別
AtomicInteger ai = new AtomicInteger(0);
ai.incrementAndGet(); // 原子遞增
ai.getAndAdd(5); // 原子加法並取舊值
ai.compareAndSet(10, 20); // CAS 更新
// 陣列
AtomicIntegerArray arr = new AtomicIntegerArray(10);
arr.getAndIncrement(0);
// 物件參考
AtomicReference ref = new AtomicReference<>("init");
ref.compareAndSet("init", "updated");
// 累加器 (Java 8+ 高併發優化)
LongAdder adder = new LongAdder();
adder.increment(); // 內部分段,極高吞吐
long sum = adder.sum();
CAS 檢查值相同但中間被改過:A→B→A。
// 解決:帶版本號的原子參考
AtomicStampedReference asr =
new AtomicStampedReference<>("A", 0);
// CAS 時同時檢查版本號
asr.compareAndSet("A", "B", 0, 1);
| 場景 | 適用 | 替代方案 |
|---|---|---|
| 狀態旗標 (running, stopped) | ✅ 完美 | - |
| 單次發布 (DCL 單例) | ✅ 配合 final | - |
| 計數器 | ❌ 非原子 | AtomicInteger, LongAdder |
| 複合操作 (check-then-act) | ❌ 需鎖 | synchronized, Lock |
| 獨立觀察值 | ✅ 良好 | - |
// 吞吐量排序 (高→低)
LongAdder > AtomicLong > synchronized > ReentrantLock
// 延遲排序 (低→高)
volatile 讀寫 ≈ 普通讀寫 < CAS < synchronized