1. 程式人生 > >sun.misc.Unsafe

sun.misc.Unsafe

his date targe clas sun safe tde read 使用

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

sun.misc.Unsafe