2016-05-19 2 views
2

Je suis tombé sur le code source de la classe AtomicInteger sur GrepCode et j'ai trouvé l'extrait de code suivant.À propos de java.util.concurrent AtomicInteger

static { 
    try { 
     valueOffset = unsafe.objectFieldOffset 
     (AtomicInteger.class.getDeclaredField("value")); 
    } catch (Exception ex) { throw new Error(ex); } 
} 
private volatile int value; 

Comment le bloc statique connaît le décalage de la valeur de la variable d'instance. Initialisation statique lorsque la classe est chargée et liée. Alors, comment pouvons-nous connaître le décalage de la valeur de l'instance au moment du chargement de la classe. Les objets sont créés après la classe chargée. Cette variable d'instance "value" aura-t-elle un décalage fixe quand un objet est créé? Veuillez expliquer.

Répondre

0

Unsafe.objectFieldOffset() obtient le décalage du champ déclaré dans la classe. Ceci est une information de niveau classe. Cela n'a rien à voir avec les valeurs d'instance de ce champ.

Le décalage est utilisé simplement pour déterminer l'emplacement de mémoire à adresser lors de la mise à jour du champ value de AtomicInteger instances.

+1

Pour clarifier, le décalage est le décalage dans la structure de données pointée par le «pointeur» 'this'. – Andreas

+0

Le décalage du champ déclaré dans la classe sera le même pour chaque instance de cette classe .Pouvez-vous en dire plus à ce sujet. –

+0

Pensez à l'instance en tant que structure de données. La position du champ 'value' à l'intérieur de cette structure de données sera la même pour chaque instance de cette structure de données. En particulier, chaque instance est représentée par un nombre d'octets contigus réservés. Disons, par exemple, que la valeur du champ 'value' est représentée par les octets 24 à 32 dans ce tableau d'octets. Dans ce cas, le décalage est 24, et ce sera comme ça pour chaque instance. –