Some 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`