在 Java 多線程編程中,volatile 和原子變量(如 AtomicInteger)都是實現線程可見性的輕量級手段,但適用場景不同。本文通過原理分析與性能測試,給出明確選擇建議。
| 特性 | volatile | 原子變量 |
|---|---|---|
| 可見性 | ✓ | ✓ (內部 value 即 volatile) |
| 原子性 | ✗ (複合操作非原子) | ✓ (CAS 實現 read-modify-write) |
| 適用操作 | 單次讀/寫、狀態標誌 | 計數器、累加器、條件更新 |
| 性能開銷 | 最低 | 略高 (CAS 循環) |
測試環境:100 線程,各執行 1000~1,000,000 次遞增操作
Calculation Times: 1,000,000 AtomicInteger: 3579 ms synchronized: 3608 ms volatile (非線程安全++): 1519 ms
結論: 原子變量性能接近 synchronized,volatile 最快但 ++ 非線程安全。
優先使用 volatile,當同時滿足:
否則使用原子變量: 計數器、序列生成器、狀態機轉換等複合操作場景。
布爾狀態標誌用
volatile boolean,數值類型優先用原子變量。
volatile 禁止指令重排,強制主內存讀寫,適合「一寫多讀」狀態發布Unsafe.compareAndSwapInt 實現無鎖 CAS,高併發下優於鎖LongAdder、DoubleAdder 進一步降低 CAS 競爭正確選擇同步工具是併發程序性能與正確性的基石,建議以 volatile 為首選,不足時升級至原子變量或鎖。