Unsafe.compareAndSwapInt是JVM内建的intrinsic函数,运行时由JIT编译为平台原生原子指令(如x86的LOCK CMPXCHG),非普通native调用,依赖硬件原子性与内存屏障保障语义。

Java 的 Unsafe.compareAndSwapInt 本身不直接调用某条特定汇编指令,而是由 JVM 在运行时根据平台和上下文,编译为对应 CPU 架构的原子读-改-写指令(如 x86 上的 LOCK CMPXCHG)。
它不是 Java 方法,而是 JVM 内建的“内在函数”(intrinsic)
JVM(如 HotSpot)对 Unsafe.compareAndSwapInt 做了特殊处理:在 JIT 编译阶段,会识别该方法调用,并替换为平台原生的原子指令,而非走普通 Java 方法调用栈。这意味着:
- 字节码中虽有
invokestatic调用,但实际执行时被 JVM “内联并替换”; - 不会进入 Java 层的 Unsafe 实现(比如
compareAndSwapInt的 native 方法体),而是跳过它; - 是否启用 intrinsic 取决于 JVM 参数(如
-XX:+UseIntrinsic,默认开启)和运行时条件(如是否已 JIT 编译、是否满足内存模型约束)。
x86/x64 平台典型映射:LOCK CMPXCHG
在 Intel/AMD 处理器上,JVM 通常生成带 LOCK 前缀的 CMPXCHG 指令:
-
CMPXCHG将累加器(EAX/RAX)与内存值比较,相等则写入新值,否则更新累加器为当前内存值; -
LOCK前缀确保该操作对其他核心/线程可见且不可中断(缓存一致性协议如 MESI 保证); - 该指令本身是 CPU 硬件支持的原子操作,无需操作系统介入或锁总线(现代 CPU 使用缓存锁定优化)。
ARM64 等其他平台对应指令不同
不同架构使用各自语义等价的原子指令:
立即学习“Java免费学习笔记(深入)”;
- ARM64:生成
LDXR(load-exclusive) +STXR(store-exclusive)配对序列; - PowerPC:使用
lwarx+stwcx.; - JVM 通过平台适配层(如 HotSpot 的
macroAssembler)自动选择正确指令序列。
注意:CAS 成功与否取决于硬件+内存模型双重保障
底层指令只是原子执行的基础,但 Java 中 CAS 的语义还依赖:
- JVM 的内存屏障插入(例如在 CAS 前后插入
LoadLoad、StoreStore等),保证重排序约束; - 对象字段的 volatile 语义(如果字段是 volatile,JVM 会增强屏障强度);
- Unsafe 方法本身不保证字段可见性 —— 它只做原子更新,字段需配合 volatile 或正确同步才能让其他线程及时看到结果。


















