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

Java 多線程基礎總結(五):原子類與 CAS 無鎖同步機制

     編輯:Java 相關知識

在進入 java.util.concurrent.atomic 包之前,必須理解其核心基石——**CAS (Compare-And-Swap,比較並交換)**。

CAS 硬件級原語

現代處理器(如 Intel x86)提供原生指令支持 CAS,操作三個操作數:

  • V:內存地址
  • A:預期原值
  • B:新值

邏輯:若 V 內存值等於 A,則原子性更新為 B;否則不修改並返回 V 當前值。這是**硬件級原子操作**,極輕量,無需操作系統內核介入,性能遠超重量級鎖。

Atomic 包核心類別

JDK 5+ 提供十幾個原子類,常見分類:

類別用途
AtomicInteger/Long/Reference基本類型與引用的原子更新
AtomicIntegerArray 等數組元素原子操作
AtomicStampedReference解決 ABA 問題(帶版本戳)
AtomicIntegerFieldUpdater 等基於反射對 volatile 字段原子更新

實戰:無鎖計數器兩種實現

// 版本 1:直接使用 AtomicInteger
class AtomicCounter {
    private AtomicInteger counter = new AtomicInteger(0);
    public void counterIncrement() {
        for (;;) {
            int current = counter.get();
            int next = current + 1;
            if (counter.compareAndSet(current, next)) return; // CAS 核心
        }
    }
}

// 版本 2:配合 volatile + FieldUpdater
class AtomicCounter2 {
    private volatile int counter;
    private static final AtomicIntegerFieldUpdater<AtomicCounter2> updater =
        AtomicIntegerFieldUpdater.newUpdater(AtomicCounter2.class, "counter");

    public int counterIncrement() {
        return updater.getAndIncrement(this); // 內部同樣是「循環 + CAS」
    }
}

關鍵模式:循環 + CAS

compareAndSet() 是原子類的「積木」。在循環中反覆嘗試,直到成功——這是構建**非阻塞並發數據結構**的通用範式。

驗證結果

  • 5000 線程並發遞增,版本 1/2 執行 20 次均得 **5000**(正確)。
  • 若改用 counter++(非原子),平均每 10 次出現 1~2 次結果 < 5000,證明 ++ 非線程安全(讀-改-寫被打斷)。

總結

原子類基於硬件 CAS 實現**無鎖同步**,大幅提升併發性能。java.util.concurrent 內部大量依賴它們。掌握「循環 + CAS」模式,是編寫高性能非阻塞算法的關鍵。

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