Java Language Utilisations de Unsafe


Exemple

Voici quelques utilisations de unsafe:

Utilisation API
Allocation de mémoire / mémoire directe, réaffectation et désallocation allocateMemory(bytes) , reallocateMemory(address, bytes) et freeMemory(address)
Clôtures à mémoire loadFence() , storeFence() , fullFence()
Fil de stationnement actuel park(isAbsolute, time) , unpark(thread)
Accès direct au champ et / ou à la mémoire get* et put* famille de méthodes
Lancer des exceptions non vérifiées throwException(e)
CAS et opérations atomiques Famille de méthodes compareAndSwap*
Mise en mémoire setMemory
Opérations volatiles ou simultanées get*Volatile , put*Volatile , putOrdered*

La famille de méthodes get et put est relative à un objet donné. Si l'objet est nul, il est traité comme une adresse absolue.

// 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);

Certaines méthodes ne sont définies que pour int et longs. Vous pouvez utiliser ces méthodes sur floats et doubles en utilisant floatToRawIntBits , intBitsToFloat, doubleToRawLongBits , longBitsToDouble`