1. Java原子类概述
在多线程编程中,原子操作是最小执行单位,不会被线程调度机制打断。Java从JDK 1.5开始提供了java.util.concurrent.atomic包,其中包含了一系列原子类,用于在多线程环境下进行无锁的线程安全操作。
原子类的核心思想是利用CAS(Compare And Swap)算法实现非阻塞同步,相比传统的synchronized关键字,它在大多数场景下能提供更好的性能表现。CAS操作包含三个操作数——内存位置(V)、预期原值(A)和新值(B)。当且仅当V的值等于A时,处理器才会用B更新V的值,否则不执行更新。
重要提示:虽然原子类性能优异,但它并不适用于所有场景。当竞争非常激烈时,CAS操作可能会频繁失败并重试,反而会降低性能。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 原子类核心原理
2.1 CAS实现机制
Java原子类的实现依赖于Unsafe类提供的底层CAS操作。以AtomicInteger为例,其核心实现代码片段如下:
java复制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 boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
这段代码展示了几个关键点:
- 通过Unsafe类获取字段的内存偏移量
- 使用volatile保证value的可见性
- compareAndSet方法底层调用Unsafe的CAS操作
2.2 内存屏障与可见性
原子类通过volatile变量和内存屏障保证内存可见性。在x86架构上,Java内存模型中的volatile写-读操作会插入以下屏障:
- StoreStore屏障:禁止上面的普通写和下面的volatile写重排序
- StoreLoad屏障:禁止上面的volatile写和下面可能的volatile读/写重排序
3. 常用原子类详解
3.1 基本类型原子类
3.1.1 AtomicInteger
AtomicInteger提供原子性的int值操作,常用方法包括:
- get()/set():获取/设置当前值
- getAndIncrement():先获取当前值再自增
- incrementAndGet():先自增再获取结果
- compar
