使用不安全

一些不安全的用途如下:

使用 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 在浮点数和双精度数上使用这些方法。