sun.misc.Unsafe是jdk中为了方便使用java语言灵活操作内存预留的类,由于该类是直接操作内存,所以从java的角度被定义为不安全的,也就是类名的由来。
经常分析jdk源码的同学肯定不陌生,因为jdk中很多地方都用到了这个类。
创建实例:、
sun.misc.Unsafe UNSAFE = sun.misc.Unsafe.getUnsafe()
主要方法如下,本质都是传入一个对象以及字段在内存中相对于对象起始地址的偏移量,还有设置的值:
//获取字段在内存中相对于对象起始地址的偏移量
private static final long parkBlockerOffset = UNSAFE.objectFieldOffset(Thread.class.getDeclaredField("parkBlocker"));
// CAS操作(需要CPU的支持)设置对象的属性值,类似的还有compareAndSwapInt等
unsafe.compareAndSwapObject(this, tailOffset, expect, update); 类似的还有compareAndSwapInt等
// 给指定的对象设值参数,第二个参数是属性在内存中相对于对象起始地址的偏移量
UNSAFE.putObject(targetObj, parkBlockerOffset, arg);
UNSAFE.putObjectVolatile(targetObj, parkBlockerOffset, arg);
// 获取对象的属性值
UNSAFE.getObject(targetObj, parkBlockerOffset);
UNSAFE.getObjectVolatile(targetObj, parkBlockerOffset);
// 挂起线程以及唤醒线程,具体参见我的其他相关随笔。
UNSAFE.park(isAbsolute, long)
UNSAFE.unpark(thread);