知识卡片

Unsafe连接硬件

普通读书笔记卡 · 1513

内容

Java 原子类的 CAS 能生效,底层是 sun.misc.Unsafe 把字段偏移量和硬件原子指令接起来:先获取偏移量,再连同对象指针传给 compareAndSwapInt,由 native 调用 CPU 原子指令。但 Unsafe 是内部危险 API——构造函数私有,不建议直接使用;业务代码应优先用 Atomic 类或 VarHandle。

参考来源

- 位置:《Java高并发核心编程.卷2,多线程、锁、JMM、JUC、高并发设计模式》第3章《CAS原理与JUC原子类》3.1.1节《Unsafe类中的CAS方法》(源文件:_epub-src/OEBPS/Text/chapter98.xhtml) - 结论依据:原文说明完成CAS操作需要先获取字段偏移量(`objectFieldOffset`),再连同对象指针一起传给Unsafe的CAS方法,由其native实现调用底层CPU指令;同时明确指出Unsafe“一般的应用开发都不会涉及此类,Java官方也不建议直接在应用程序中使用”,因此推出本卡关于内部实现桥梁、不应作为业务代码直接依赖的结论。 - 原始内容:Unsafe大量的方法都是native方法……这个类对普通程序员来说是“危险”的,一般的应用开发都不会涉及此类,Java官方也不建议直接在应用程序中使用这些类……Unsafe提供的CAS方法包含4个操作数——字段所在的对象、字段内存位置、预期原值及新值。