Il modello di memoria java richiede che la scrittura di int
sia atomica: ovvero, se si scrive un valore (composto da 4 byte) in un thread e lo si legge in un altro, si ottieni tutti i byte o nessuno, ma mai 2 nuovi byte e 2 vecchi byte o simili.Sta scrivendo un riferimento atomico su macchine virtuali a 64 bit
Questo non è garantito per long
. In questo caso, la scrittura di 0x1122334455667788
in una variabile contenente 0
prima potrebbe comportare un'altra lettura di thread 0x112233440000000
o 0x0000000055667788
.
Ora le specifiche non impongono che i riferimenti agli oggetti siano int sia di lunga durata. Per motivi di sicurezza del tipo, sospetto che siano garantiti per essere scritti atomicamente, ma su una macchina virtuale a 64 bit questi riferimenti potrebbero essere molto buoni a 64 bit (solo indirizzi di memoria).
Ora qui sono le mie domande:
- Esistono specifiche modello di memoria che coprono questo (che non ho trovato)?
- Le sospette scritture lunghe sono atomiche su macchine virtuali a 64 bit?
- Le macchine virtuali sono forzate a mappare i riferimenti a 32 bit?
saluti, Steffen
@Steffen Heil: fare i difficili, ma di notare che non tutti i riferimenti sono a 64 bit internamente anche a 64 bit VM (a causa della straordinaria quantità di rifiuti 64 riferimenti bit stanno generando).Le moderne macchine virtuali usano la compressione del puntatore/compressione di riferimento chiamata * "CompressedOops" *: http://wikis.sun.com/display/HotSpotInternals/CompressedOops Quindi non sono d'accordo sul fatto che * potrebbero * avere un valore a 64 bit ma spesso non sono 't (non che cambia molto alla risposta che Dirk ha pubblicato). – SyntaxT3rr0r