使用不安全
一些不安全的用途如下:
| 使用 | API |
|---|---|
| 關閉堆/直接記憶體分配,重新分配和釋放 | allocateMemory(bytes),reallocateMemory(address, bytes) 和 freeMemory(address) |
| 記憶圍欄 | loadFence(),storeFence(),fullFence() |
| 停車當前執行緒 | park(isAbsolute, time),unpark(thread) |
| 直接欄位和/或記憶體訪問 | get*和 put*系列方法 |
| 丟擲未經檢查的異常 | throwException(e) |
| CAS 和原子操作 | compareAndSwap*系列方法 |
| 設定記憶體 | setMemory |
| 易失性或併發操作 | get*Volatile,put*Volatile,putOrdered* |
get 和 put 系列方法與給定物件相關。如果物件為 null,則將其視為絕對地址。
// Putting a value to a field
protected static long fieldOffset = UNSAFE.objectFieldOffset(getClass().getField("theField"));
UNSAFE.putLong(this, fieldOffset , newValue);
// Puting an absolute value
UNSAFE.putLong(null, address, newValue);
UNSAFE.putLong(address, newValue);
有些方法僅針對 int 和 long 定義。你可以使用 floatToRawIntBits,intBitsToFloat,doubleToRawLongBits,longBitsToDouble 在浮點數和雙精度數上使用這些方法。