Java篇--如何获取Unsafe类的实例
如何获取Unsafe类的实例
Unsafe 提供两个功能
- 绕过 JVM 直接修改内存(对象)
- 使用硬件 CPU 指令实现 CAS 原子操作
Unsafe 为调用者提供执行非安全操作的能力,由于返回的 Unsafe 对象可以读写任意的内存地址数据,调用者应该小心谨慎的使用改对象,一定不用把它传递到非信任代码。该类的大部分方法都是非常底层的操作,并牵涉到一小部分典型的机器都包含的硬件指令,编译器可以对这些进行优化。
我们在一般的并发编程中不会直接用到 Unsafe,但是很多 Java 基础类库与诸如 Netty、Cassandra 和 Kafka 等高性能库都采用它,它在提升 Java 运行效率、增强 Java 语言底层操作能力方面起了很大作用,但因为太强大,所以有诸多限制:
- Unsafe 只能用于 Hotspot 虚拟机
- unsafe无法直接通过常规方法获取到实例,可以使用反射的方法获取到
theUnsafe
实例
private static Unsafe getUnsafe() {
try {
Field f = Unsafe.class.getDeclaredField("theUnsafe");
f.setAccessible(true);
return (Unsafe) f.get(null);
} catch (Exception e) {
/* ... */
}
return null;
}