
Unsafe 类本身不直接提供“CAS 方法”,而是通过底层 native 方法暴露原子操作能力,JDK 中的 AtomicInteger 等类才封装出易用的 CAS 接口。
Unsafe 的核心 CAS 方法是 compareAndSwapXxx
Unsafe 定义了多个以 compareAndSwap 开头的 native 方法,例如:
compareAndSwapInt(Object obj, long offset, int expectedValue, int newValue)compareAndSwapLong(Object obj, long offset, long expectedValue, long newValue)compareAndSwapObject(Object obj, long offset, Object expectedValue, Object newValue)
这些方法接收对象、字段内存偏移量、期望值和新值,由 JVM 在硬件层面调用 CPU 的 CAS 指令(如 x86 的 cmpxchg)完成原子比较并交换。成功返回 true,失败返回 false,不会阻塞。
必须配合字段偏移量使用
Unsafe 不支持按字段名操作,所有 CAS 都基于对象内字段的内存地址偏移量(long offset)。获取偏移量需调用:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
objectFieldOffset(Field field):用于普通实例字段 -
staticFieldOffset(Field field):用于 static 字段(还需配合staticFieldBase)
例如,对 AtomicInteger.value 字段,先通过反射拿到 value 字段,再用 objectFieldOffset 计算其在对象实例中的偏移位置,后续 CAS 才能精准作用于该内存单元。
JDK 原子类才是日常使用的 CAS 封装
开发者几乎从不直接调用 Unsafe 的 CAS 方法,而是使用 java.util.concurrent.atomic 包中的类型,比如:
AtomicInteger.compareAndSet(expected, newValue)AtomicReference.compareAndSet(expected, newValue)
这些方法内部正是调用 Unsafe 的对应 CAS native 方法,并已处理好字段偏移、volatile 语义、重试逻辑等细节。它们屏蔽了 Unsafe 的危险性(如指针运算、内存越界),也避免了手动管理偏移量的繁琐。
注意 Unsafe 的访问限制与替代方案
自 JDK 9 起,Unsafe 被列为 restricted 类,普通代码无法直接获取其实例(Unsafe.getUnsafe() 仅对 boot classpath 或特定模块开放)。主流方式是通过反射绕过(不推荐生产环境),或使用 VarHandle(JDK 9+)作为安全替代——它提供了更高层、标准化的原子操作 API,同样基于底层 CAS,但具备访问控制和更好可维护性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










