reflexion - reflection en java
Escribir largo y doble no es atómico en Java? (6)
Leer y escribir una sola variable es atómico (¡garantía de idioma!), A menos que la variable sea de tipo largo o doble.
Estaba leyendo las diapositivas de un curso y encontré eso escrito. La clase era sobre concurrencia.
¿Alguien puede explicarme por qué escribir un largo o un doble no es una operación atómica? Realmente me tomó por sorpresa.
No es atómico porque es una operación de múltiples pasos en el nivel de código de máquina. Es decir, los largos y los dobles son más largos que la longitud de palabra del procesador.
Solo para aclarar la situación de Java, los dobles y los largos no se leen o escriben de forma atómica a menos que se los declare volatile
El 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.
Java long y double no son atómicos en máquinas de 32 bits, sino atómicos en máquinas de 64 bits con algunas de las JVM de 64 bits. ¿por qué depende de la longitud del bit de la máquina? Porque la máquina de 32 bits necesita dos escrituras por mucho tiempo (siempre que sea de 64 bits). Lea esto para obtener información detallada.
Lea la respuesta de maaartinus @ ¿Qué operaciones en Java se consideran atómicas?
Lea la respuesta de Jon Skeet @ ¿ Cuándo los tipos de datos primitivos no son seguros para subprocesos en Java?
Según el JLS , puede hacer que la operación de lectura y escritura sea doble y larga para que sea atómica al declararla como volátil. Pero esto no asegurará que ++ sea atómico. Eso necesita un paquete concurrente.atómico.
Lee esta respuesta de Louis Wasserman.
También este blog y comentarios.
Muchos programadores deben haber leído esta afirmación en "3.1.2 Operaciones de 64 bits no automáticas" en la concurrencia de Java en la práctica. He consultado el último JLS https://docs.oracle.com/javase/specs/jls/se9/html/jls-17.html#jls-17.7 . Todavía no afirman que la jVM de 64 bits sea la norma en estos días. Así que las operaciones de 64 bits se dividen en operaciones de 32 bits que rompen la atomicidad y son peligrosas para usar en entornos de múltiples hilos hasta que se declaren volátiles. Long y Double tienen 64 bits de largo en Java. Así que las operaciones de escritura y lectura no son atómicas en Java.