简书 占小狼
转载请注明原创出处,谢谢!
前言
Java最初被设计为一种安全的受控环境。尽管如此,HotSpot还是包含了一个后门sun.misc.Unsafe,提供了一些可以直接操控内存和线程的底层操作。Unsafe被JDK广泛应用于java.nio和并发包等实现中,这个不安全的类提供了一个观察HotSpot JVM内部结构并且可以对其进行修改,但是不建议在生产环境中使用。
如何使用
Unsafe类是如此地不安全,以至于JDK开发者增加了很多特殊限制来访问它。
- 私有的构造器
- 工厂方法getUnsafe()的调用器只能被Bootloader加载,否则抛出SecurityException 异常
不过,我们可以通过反射机制轻松获取Unsafe的一个实例。
public static Unsafe getUnsafe() {
try {
Field f = Unsafe.class.getDeclaredField("theUnsafe");
f.setAccessible(true);
return (Unsafe)f.get(null);
} catch (Exception e) {
/* ... */
}
}
一些有用的方法
- objectFieldOffset:能够获取到指定实例变量的在对象内存中的偏移量
long offset = UNSAFE.objectFieldOffset(UnsafeTest.class.getDeclaredField("state"));
- compareAndSwapInt:通过比较并替换的机制,修改指定偏移量内存的值
UNSAFE.compareAndSwapInt(unsafeTest, offset, 0, 1)
- park:挂起某一线程
- unpark:唤醒某一线程
未完...
END。
我是占小狼。
在魔都艰苦奋斗,白天是上班族,晚上是知识服务工作者。
读完我的文章有收获,记得关注和点赞哦,如果非要打赏,我也是不会拒绝的啦!