1. Java原子操作类概述
在多线程编程中,保证数据操作的原子性是确保线程安全的关键。Java从JDK 1.5开始,在java.util.concurrent.atomic包下提供了一系列原子操作类,这些类能够在不使用锁的情况下实现线程安全的操作。原子操作类的底层实现主要依赖于CAS(Compare-And-Swap)机制和volatile关键字。
原子操作类主要分为以下四类:
- 基本类型原子类:AtomicBoolean、AtomicInteger、AtomicLong
- 数组类型原子类:AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray
- 引用类型原子类:AtomicReference、AtomicStampedReference、AtomicMarkableReference
- 字段更新原子类:AtomicIntegerFieldUpdater、AtomicLongFieldUpdater、AtomicReferenceFieldUpdater
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基本类型原子类详解
2.1 AtomicInteger原理与使用
AtomicInteger是最常用的原子类之一,它提供了原子性的int值操作。其核心实现依赖于Unsafe类的CAS操作:
java复制public class AtomicInteger extends Number implements java.io.Serializable {
private static final Unsafe unsafe = Unsafe.getUnsafe();
private static final long valueOffset;
static {
try {
valueOffset = unsafe.objectFieldOffset
(AtomicInteger.class.getDeclaredField("value"));
} catch (Exception ex) { throw new Error(ex); }
}
private volatile int value;
public final int getAndIncrement() {
return unsafe.getAndAddInt(this, valueOffset, 1);
}
}
典型使用场景:
- 计数器:多线程环境下的计数操作
- 序列号生成:保证序列号的唯一性和递增性
- 状态标志:替代volatile boolean的复杂状态管理
注意:虽然AtomicInteger性能优于synchronized,但在高并发场景下频繁的CAS失败会导致CPU资源浪费,此时应考虑LongAdder。
2.2 AtomicBoolean实现分析
AtomicBoolean内部使用int值存储状态(1表示true,0表示false),其核心方法compareAndSet实现如下:
java复制public final boolean compareAndSet(boolean expect, boolean update) {
int e = ex
