AtomicInteger 源码:Unsafe 类¶
一、Unsafe 是什么¶
sun.misc.Unsafe,JDK 内部使用的类,提供直接操作内存和线程的能力。普通应用不应该用。
二、AtomicInteger 里的 Unsafe¶
private static final Unsafe U;
private static final long VALUE;
static {
U = Unsafe.getUnsafe();
VALUE = U.objectFieldOffset(AtomicInteger.class.getDeclaredField("value"));
}
private volatile int value;
关键操作¶
objectFieldOffset:拿到 value 字段在对象内存里的偏移量。getIntVolatile:volatile 读。compareAndSwapInt:CAS 操作。
三、Unsafe 能做什么¶
| 方法 | 作用 |
|---|---|
compareAndSwapInt |
CAS 操作 |
getIntVolatile |
volatile 读 |
putIntVolatile |
volatile 写 |
park/unpark |
阻塞/唤醒线程 |
allocateMemory |
直接分配堆外内存 |
arrayBaseOffset/arrayIndexScale |
数组元素偏移 |
四、为什么是 JDK 内部用¶
Unsafe 绕过了 JVM 安全机制: - 可以直接改内存。 - 可以创建对象不调构造函数。 - 可以修改 final 字段。
用错了就是 OOM、崩溃、数据错乱。
五、JDK 11+ 的替代¶
JDK 9 引入 VarHandle,JDK 11 逐步替换 Unsafe。但 JUC 底层还是 Unsafe。
六、AtomicInteger 结构¶
所有 CAS 操作都通过 U.compareAndSwapInt(this, VALUE, expect, update) 完成。
面试要点
- Unsafe 不能直接 new,要通过反射拿。
- AtomicInteger 不用 synchronized,靠 Unsafe 的 CAS。
- value 是 volatile,保证可见性。