Das Java-Speichermodell schreibt vor, dass das Schreiben einer int
atomaren ist: Wenn Sie also einen Wert (bestehend aus 4 Bytes) in einem Thread schreiben und es in einem anderen lesen, werden Sie bekomme alle Bytes oder keine, aber niemals 2 neue Bytes und 2 alte Bytes oder ähnliches.Schreiben einer Referenz atomic auf 64bit VMs
Dies ist nicht garantiert für long
. Hier könnte das Schreiben von 0x1122334455667788
in eine Variable, die 0
enthält, zu einem anderen Thread führen, der 0x112233440000000
oder 0x0000000055667788
lautet.
Nun schreibt die Spezifikation nicht vor, dass Objektreferenzen entweder int oder lang sein sollen. Aus Typensicherheitsgründen vermute ich, dass sie garantiert atomar geschrieben sind, aber auf einer 64-Bit-VM könnten diese Referenzen sehr gut 64-Bit-Werte (nur Speicheradressen) sein.
Jetzt sind hier meine Fragen:
- es irgendwelche Speichermodell-Spezifikationen abdecken dies (das habe ich nicht gefunden)?
- Sind lange Schreibvorgänge vermutlich atomar auf 64-Bit-VMs?
- Werden VMs gezwungen, Referenzen auf 32-Bit zuzuordnen?
Grüße, Steffen
@Steffen Heil: Erbsenzählerei aber beachten Sie, dass nicht alle Verweise 64 Bit intern auch auf 64-Bit-VM (aufgrund der erstaunlichen Menge an Abfall 64-Bit-Referenzen erzeugen) sind.Moderne VMs verwenden Pointer-Komprimierung/Referenz-Komprimierung genannt * "CompressedOops" *: http://wikis.sun.com/display/HotSpotInternals/CompressedOops Also ich bin nicht anderer Meinung, dass sie 64-Bit-Wert sein könnten, aber sie oft aren 't (nicht, dass es sich viel ändert zu der Antwort, die Dirk gepostet hat). – SyntaxT3rr0r