volatile 與 Atomic* 類是 Java 併發編程中兩種輕量級同步手段,前者保證可見性,後者提供原子性複合操作。本文對比原理、適用場景與局限。
volatile int count; count++; 仍非原子(讀-改-寫三步)。volatile boolean shutdown)、雙重檢查鎖單例模式。public volatile static int count = 0;AtomicInteger/Long/Boolean:基本類型原子更新。AtomicReference<V>:引用類型原子更新。AtomicIntegerArray/LongArray/ReferenceArray:數組元素原子更新。AtomicStampedReference:帶版本戳解決 ABA 問題。getAndIncrement() // i++ 原子 compareAndSet(expect, update) // CAS 成功返回 true getAndSet(newValue) // 獲取舊值並設置新值 accumulateAndGet(x, (a,b)->a+b) // Java 8 函數式更新
| 特性 | volatile | Atomic 類 |
|---|---|---|
| 可見性 | ✅ | ✅ (內部 volatile 字段) |
| 原子性 | ❌ (單讀/寫原子,復合操作非原子) | ✅ (CAS 保證復合操作原子) |
| 性能開銷 | 極低 (內存屏障) | 低 (CAS 自旋,高併發下重試開銷) |
| 適用數據類型 | 基本類型、引用類型 | 基本類型、引用、數組、字段更新器 |
| ABA 問題 | 不涉及 | 需 AtomicStampedReference 解決 |
volatile。AtomicInteger 等。synchronized / Lock。