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);