跳转至

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 结构

AtomicInteger 对象
  ├── object header
  ├── value: volatile int   ← 实际值,偏移量 VALUE
  └── 其他字段

所有 CAS 操作都通过 U.compareAndSwapInt(this, VALUE, expect, update) 完成。

面试要点

  • Unsafe 不能直接 new,要通过反射拿。
  • AtomicInteger 不用 synchronized,靠 Unsafe 的 CAS。
  • value 是 volatile,保证可见性。