在進入 java.util.concurrent.atomic 包之前,必須理解其核心基石——**CAS (Compare-And-Swap,比較並交換)**。
現代處理器(如 Intel x86)提供原生指令支持 CAS,操作三個操作數:
邏輯:若 V 內存值等於 A,則原子性更新為 B;否則不修改並返回 V 當前值。這是**硬件級原子操作**,極輕量,無需操作系統內核介入,性能遠超重量級鎖。
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」
}
}
compareAndSet() 是原子類的「積木」。在循環中反覆嘗試,直到成功——這是構建**非阻塞並發數據結構**的通用範式。
counter++(非原子),平均每 10 次出現 1~2 次結果 < 5000,證明 ++ 非線程安全(讀-改-寫被打斷)。原子類基於硬件 CAS 實現**無鎖同步**,大幅提升併發性能。java.util.concurrent 內部大量依賴它們。掌握「循環 + CAS」模式,是編寫高性能非阻塞算法的關鍵。