sun.misc.Unsafe是jdk中为了方便使用java语言灵活操做内存预留的类,因为该类是直接操做内存,因此从java的角度被定义为不安全的,也就是类名的由来。java
常常分析jdk源码的同窗确定不陌生,由于jdk中不少地方都用到了这个类。安全
建立实例:、this
sun.misc.Unsafe UNSAFE = sun.misc.Unsafe.getUnsafe()线程
主要方法以下,本质都是传入一个对象以及字段在内存中相对于对象起始地址的偏移量,还有设置的值:对象
//获取字段在内存中相对于对象起始地址的偏移量内存
private static final long parkBlockerOffset = UNSAFE.objectFieldOffset(Thread.class.getDeclaredField("parkBlocker"));get
// CAS操做(须要CPU的支持)设置对象的属性值,相似的还有compareAndSwapInt等源码
unsafe.compareAndSwapObject(this, tailOffset, expect, update); 相似的还有compareAndSwapInt等class
// 给指定的对象设值参数,第二个参数是属性在内存中相对于对象起始地址的偏移量thread
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);