java - example - Está escribiendo una referencia atómica en máquinas virtuales de 64 bits
synchronized method java example (1)
Ver JLS sección 17.7: Tratamiento no atómico de doble y largo
A los efectos del modelo de memoria del lenguaje de programación Java, una sola escritura en un valor largo o doble no volátil se trata como dos escrituras separadas: una para cada mitad de 32 bits. Esto puede dar como resultado una situación en la que un hilo ve los primeros 32 bits de un valor de 64 bits de una escritura, y los segundos 32 bits de otra escritura.
Las escrituras y lecturas de valores volátiles largos y dobles siempre son atómicos.
Las escrituras y lecturas de referencias son siempre atómicas, independientemente de si están implementadas como valores de 32 bits o de 64 bits.
Algunas implementaciones pueden encontrar conveniente dividir una sola acción de escritura en un valor largo o doble de 64 bits en dos acciones de escritura en valores adyacentes de 32 bits. Por razones de eficiencia, este comportamiento es específico de la implementación; una implementación de Java Virtual Machine es libre de realizar escrituras en valores largos y dobles de forma atómica o en dos partes.
Se recomienda que las implementaciones de la Máquina Virtual de Java eviten dividir los valores de 64 bits cuando sea posible. Los programadores son alentados a declarar los valores compartidos de 64 bits como volátiles o sincronizar sus programas correctamente para evitar posibles complicaciones.
(Énfasis añadido)
El modelo de memoria java exige que escribir un int
sea atómico: es decir, si le escribe un valor (que consta de 4 bytes) en un hilo y lo lee en otro, obtendrá todos los bytes o ninguno, pero nunca 2 bytes nuevos y 2 viejos bytes o tal.
Esto no está garantizado por long
. Aquí, escribir 0x1122334455667788
en una variable que contiene 0
antes podría dar como resultado otra lectura de hilo 0x112233440000000
o 0x0000000055667788
.
Ahora la especificación no obliga a las referencias de objeto a ser int o long-sized. Por motivos de seguridad de tipo, sospecho que se garantiza que se escribirán atómicamente, pero en una VM de 64 bits estas referencias podrían ser valores de 64 bits muy buenos (simplemente direcciones de memoria).
Ahora aquí están mis preguntas:
- ¿Hay alguna especificación de modelo de memoria que cubra esto (que no he encontrado)?
- ¿Las escrituras largas son sospechosas de ser atómicas en máquinas virtuales de 64 bits?
- ¿Las máquinas virtuales están obligadas a mapear referencias a 32 bits?
Saludos, Steffen