Le modèle de mémoire java impose que l'écriture d'un fichier int
est atomique : C'est-à-dire que si vous y écrivez une valeur (constituée de 4 octets) dans un thread et que vous la lisez dans un autre, vous obtiendrez tous les octets ou aucun, mais jamais 2 nouveaux octets et 2 anciens octets ou autre.
Ceci n'est pas garanti pour long
. Ici, l'écriture 0x1122334455667788
à une variable contenant 0
avant pourrait rés rés rés rés rés rés rés rés rés rés rés rés rés rés rés rés rés rés rés rés rés rés rés rés rés rés rés rés rés rés rés rés rés rés rés d'un autre fil de lecture 0x112233440000000
o 0x0000000055667788
.
Aujourd'hui, la spécification n'impose pas que les références d'objets soient de taille int ou longue. Pour des raisons de sécurité de type, je soupçonne qu'elles sont garanties d'être écrites de manière atomique, mais sur une VM 64 bits, ces références pourraient très bien être des valeurs 64 bits (simplement des adresses mémoire).
Maintenant, voici mes questions :
- Existe-t-il des spécifications de modèles de mémoire couvrant ce point (que je n'ai pas trouvées) ?
- Les écritures longues sont-elles suspectées d'être atomiques sur les VM 64 bits ?
- Les VM sont-elles obligées de mapper les références en 32 bits ?
Regards, Steffen
2 votes
@Steffen Heil : pinaillage mais notez que toutes les références ne sont pas 64 bits en interne même sur une VM 64 bits (en raison de la quantité incroyable de déchets que les références 64 bits génèrent). Les VM modernes utilisent la compression des pointeurs/références appelée "CompressedOops" : wikis.sun.com/affichage/HotSpotInternals/CompressedOops Donc je ne suis pas en désaccord avec le fait qu'ils pourrait être une valeur 64 bits, mais ils ne le sont souvent pas (ce qui ne change pas grand-chose à la réponse que Dirk a postée).