2016-05-19 9 views
2

Ich stieß auf den Quellcode der AtomicInteger-Klasse auf GrepCode und fand folgenden Code-Snippet.Über java.util.concurrent AtomicInteger

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

Wie der statische Block den Offset des Variablenwerts der Instanz kennt. Statische Initialisierung, wenn die Klasse geladen und verknüpft wird. Wie können wir also über den Offset des Instanzwerts zur Ladezeit der Klasse wissen? Objekte werden nach dem Laden der Klasse erstellt. Ist diese "Wert" -Instanzvariable einen festen Offset, wenn ein Objekt erstellt wird? Bitte erläutern.

Antwort

0

Unsafe.objectFieldOffset() erhält den Offset des deklarierten Feldes in der Klasse. Dies sind Informationen auf Klassenebene. Es hat nichts mit den Instanzwerten dieses Feldes zu tun.

Der Offset wird nur verwendet, um zu ermitteln, an welchen Speicherort bei der Aktualisierung des value-Felds von AtomicInteger Instanzen zu richten ist.

+1

Um zu verdeutlichen, ist der Offset der Offset in die Datenstruktur, auf die der "this" -Zeiger zeigt. – Andreas

+0

Der Offset des deklarierten Feldes in der Klasse ist für jede Instanz dieser Klasse gleich. Können Sie mehr dazu ausführen? –

+0

Denken Sie an die Instanz als Datenstruktur. Die Position des "Wert" -Feldes innerhalb dieser Datenstruktur ist für jede Instanz dieser Datenstruktur gleich. Insbesondere wird jede Instanz durch eine feste reservierte zusammenhängende Anzahl von Bytes repräsentiert. Nehmen wir zum Beispiel an, dass der Wert des Felds "Wert" in diesem Byte-Array durch Byte 24 bis 32 repräsentiert wird. In diesem Fall ist der Offset 24, und das wird für jeden Fall so sein. –

Verwandte Themen