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

Java 併發核心:volatile 可見性與 Atomic 原子操作原理、適用場景對比

     編輯:Java 綜合教學

Java 併發核心:volatile 可見性與 Atomic 原子操作原理、適用場景對比

volatile 與 Atomic* 類是 Java 併發編程中兩種輕量級同步手段,前者保證可見性,後者提供原子性複合操作。本文對比原理、適用場景與局限。

volatile 關鍵字

  • 作用:修飾成員變量,保證多線程間的可見性(一線程寫入,其他線程立即可見最新值)。
  • 不保證:原子性。volatile int count; count++; 仍非原子(讀-改-寫三步)。
  • 底層:內存屏障指令,禁止指令重排序,強制刷新緩存到主內存/從主內存讀取。
  • 適用場景:單寫多讀的狀態標誌(如 volatile boolean shutdown)、雙重檢查鎖單例模式。
  • 聲明:public volatile static int count = 0;

Atomic 原子操作類

  • 核心原理:CAS(Compare-And-Swap)無鎖算法,CPU 指令級原子操作。
  • 常用類:
    • 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 函數式更新
  • 適用場景:計數器、序列號生成、狀態機無鎖轉換、高併發統計。

對比總結

特性volatileAtomic 類
可見性✅✅ (內部 volatile 字段)
原子性❌ (單讀/寫原子,復合操作非原子)✅ (CAS 保證復合操作原子)
性能開銷極低 (內存屏障)低 (CAS 自旋,高併發下重試開銷)
適用數據類型基本類型、引用類型基本類型、引用、數組、字段更新器
ABA 問題不涉及需 AtomicStampedReference 解決

選擇建議

  • 單一標誌位、雙重檢查鎖 → volatile。
  • 計數器、ID 生成、狀態無鎖更新 → AtomicInteger 等。
  • 複雜不變性條件、多變量關聯 → synchronized / Lock。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved