Java中的原子类位于java.util.concurrent.atomic
包下,根据功能可分为四类,其核心原理均基于 volatile变量保证内存可见性 和 CAS(Compare-and-Swap)操作保证原子性:
⚛️ 一、基本类型原子类
AtomicBoolean
- 原理:内部用
volatile int value
存储状态(0=false,1=true),通过Unsafe的compareAndSwapInt
实现原子更新。
- 原理:内部用
AtomicInteger
- 原理:通过
volatile int value
存储值,使用Unsafe的getAndAddInt
等CAS操作实现原子增减(如incrementAndGet()
)。
- 原理:通过
AtomicLong
- 原理:类似
AtomicInteger
,使用volatile long value
和CAS操作;64位系统需处理64位对齐问题。
- 原理:类似
🔢 二、数组类型原子类
AtomicIntegerArray
- 原理:内部维护
final int[] array
,计算元素偏移地址后通过Unsafe的CAS操作数组元素。
- 原理:内部维护
AtomicLongArray
- 原理:类似
AtomicIntegerArray
,支持long
数组的原子操作。
- 原理:类似
AtomicReferenceArray
- 原理:通过偏移地址和
compareAndSwapObject
实现引用类型数组元素的原子替换。
- 原理:通过偏移地址和
🔗 三、引用类型原子类
AtomicReference<V>
- 原理:通过
volatile V value
存储引用,Unsafe的compareAndSwapObject
实现引用的原子替换。
- 原理:通过
AtomicStampedReference<V>
- 原理:在引用基础上增加
int stamp
(版本戳),解决CAS的ABA问题(同时检查引用和版本戳)。
- 原理:在引用基础上增加
AtomicMarkableReference<V>
- 原理:用布尔标记(
boolean mark
)替代版本戳,简化ABA问题处理。
- 原理:用布尔标记(
🛠️ 四、字段更新器
AtomicIntegerFieldUpdater<T>
- 原理:通过反射更新目标类的
volatile int
字段,底层使用CAS保证原子性。
- 原理:通过反射更新目标类的
AtomicLongFieldUpdater<T>
- 原理:类似上述,支持
long
字段。
- 原理:类似上述,支持
AtomicReferenceFieldUpdater<T,V>
- 原理:支持引用类型字段的原子更新,依赖反射和CAS。
🔬 原理共性总结
- 内存可见性:所有原子类内部使用
volatile
修饰变量,确保多线程下读取最新值。 - 原子性保障:依赖Unsafe类的CAS操作(如
compareAndSwapInt
),自旋重试直到更新成功。 - 无锁优化:相比
synchronized
,CAS避免线程阻塞,提升高并发性能。
⚠️ 注意:原子类仅适用于单个变量的简单操作(如增减、替换)。复杂逻辑仍需锁或其他同步机制。