Uses of Unsafe
suggest changeSome uses of unsafe is s follows:
Use | API |
—— | —— |
Off heap / direct memory allocation, reallocation and deallocation | allocateMemory(bytes)
, reallocateMemory(address, bytes)
and freeMemory(address)
|
Memory fences | loadFence()
, storeFence()
, fullFence()
|
Parking current thread | park(isAbsolute, time)
, unpark(thread)
|
Direct field and or memory access | get*
and put*
family of methods |
Throwing unchecked exceptions | throwException(e)
|
CAS and Atomic Operations | compareAndSwap*
family of methods |
Setting out memory | setMemory
|
Volatile or concurrent operations | get*Volatile
, put*Volatile
, putOrdered*
|
The get and put family of methods are relative to a given object. If the object is null then it is treated as an absolute address.
// 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);
Some methods are only defined for int and longs. You can use these methods on floats and doubles using floatToRawIntBits
, intBitsToFloat,
doubleToRawLongBits,
longBitsToDouble`