使用不安全
一些不安全的用途如下:
使用 | 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 在浮点数和双精度数上使用这些方法。