【Java面试笔记:进阶】22.AtomicInteger底层实现原理是什么?如何在自己的产品代码中应用CAS操作?
AtomicInteger
是 Java 并发包中提供的一个原子整数类,用于在多线程环境下实现无锁的原子操作。其核心原理基于 CAS(Compare-And-Swap)
算法和 volatile
内存语义。
1.AtomicInteger底层实现原理
1.基于CAS技术
AtomicInteger
通过CAS(Compare-And-Swap
)操作实现原子性更新。CAS
操作包括获取当前值、进行运算,并尝试通过CAS
指令更新值。- 如果当前值未被其他线程修改,则更新成功;否则,根据具体实现选择重试或返回结果。
- 操作伪代码:
int compare_and_swap(int* reg, int oldval, int newval) {int old_reg_val = *reg;if (old_reg_val == oldval) {*reg = newval;}return old_reg_val;
}
2.依赖Unsafe类
- 使用Unsafe提供的底层能力,通过
Unsafe.objectFieldOffset
获取value
字段在对象内存中的偏移量,直接操作内存地址。 - 例如,
getAndIncrement
方法利用Unsafe.getAndAddInt
实现。
3.volatile字段保证可见性
- 内部使用
volatile
修饰的value
字段存储数值,确保线程间的可见性(即一个线程修改后,其他线程立即可见最新值)。
4. 核心源码解析
AtomicInteger
的源码(简化版)如下:
public class AtomicInteger {private volatile int value; // 使用 volatile 保证可见性private static final Unsafe unsafe = Unsafe.getUnsafe();private static final long valueOffset; // value 字段的内存偏移量static {try {// 获取 value 字段在对象内存中的偏移量valueOffset = unsafe.objectFieldOffset(AtomicInteger.class.getDeclaredField("value"))