El modelo de memoria java indica que escribir un int
es atómico: Es decir, si escribe un valor para él (que consta de 4 bytes) en un hilo y lo lee en otro, lo hará obtener todos los bytes o ninguno, pero nunca 2 bytes nuevos y 2 bytes viejos o tal.Está escribiendo una referencia atómica en máquinas virtuales de 64 bits
Esto no está garantizado para long
. Aquí, escribir 0x1122334455667788
en una variable que contenga 0
antes podría dar como resultado otro hilo que lea 0x112233440000000
o 0x0000000055667788
.
Ahora, la especificación no obliga a las referencias de objetos 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 especificaciones modelo de memoria que cubren este (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 forzadas a asignar referencias a 32 bits?
Saludos, Steffen
@Steffen Heil: nitpicking pero tenga en cuenta que no todas las referencias son de 64 bits internamente incluso en 64 bits VM (debido a la increíble cantidad de residuos que se generan referencias 64 bits).Las máquinas virtuales modernas están utilizando compresión/compresión de puntero llamada * "CompressedOops" *: http://wikis.sun.com/display/HotSpotInternals/CompressedOops Así que no estoy en desacuerdo con que * podrían * tener un valor de 64 bits, pero a menudo no lo son. 't (no es que cambie mucho a la respuesta que Dirk publicó). – SyntaxT3rr0r