首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 併發編程:volatile 變量與原子變量選擇指南

     編輯:Java 相關知識

在 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,當同時滿足:

  1. 寫入不依賴當前值,或僅單線程寫入
  2. 不與其他狀態組成不變條件
  3. 訪問時無需加鎖

否則使用原子變量: 計數器、序列生成器、狀態機轉換等複合操作場景。

作者實踐總結

布爾狀態標誌用 volatile boolean,數值類型優先用原子變量。

原理補充

  • volatile 禁止指令重排,強制主內存讀寫,適合「一寫多讀」狀態發布
  • 原子類基於 Unsafe.compareAndSwapInt 實現無鎖 CAS,高併發下優於鎖
  • JDK 8+ 提供 LongAdder、DoubleAdder 進一步降低 CAS 競爭

正確選擇同步工具是併發程序性能與正確性的基石,建議以 volatile 為首選,不足時升級至原子變量或鎖。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved