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避免线程阻塞,提升高并发性能。
⚠️ 注意:原子类仅适用于单个变量的简单操作(如增减、替换)。复杂逻辑仍需锁或其他同步机制。