2009-02-05 16 views
20

La lectura y escritura de una sola variable es atómica (¡garantía de idioma!), A menos que la variable sea de tipo largo o doble.Escribir largo y doble no es atómico en Java?

Estaba leyendo las diapositivas de un curso y lo encontré por escrito. La clase era sobre concurrencia.

¿Alguien puede explicarme por qué escribir una larga o una doble no es una operación atómica? Realmente me tomó por sorpresa.

+0

1.) ¿Qué idioma/entorno? 2.) El enlace que ha publicado está protegido con contraseña –

+0

oh sry: S firefox está almacenando la contraseña, lo olvidó por completo – fmsf

+0

y dice que es independiente del idioma – fmsf

Respuesta

28

No es atómico porque es una operación de varios 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.

+3

Derecha. Y en una máquina de 64 bits con una longitud de 64 bits, escribir probablemente probablemente * será * atómico, a menos que esté hablando de una JVM o algo así. –

+0

en una máquina de 64 un largo tendrá 128 bits como el int ya como 64 – fmsf

+7

Depende del idioma, supongo. Estoy bastante seguro de que los tipos primitivos de Java tienen una longitud específica en todas las máquinas. –

23

sólo para aclarar la situación para Java, dobles y largos no se leen o escriben a atómicamente a menos que sean declarados volatile

JLS - Nonatomic Treatment of double and long

+5

estas operaciones son atómicas en 64 bits JVM, que es la norma en estos días –

+3

Solo para respaldar a Amrish, observé una presentación (panel de discusión) que tuvo Cliff Click y Doug Lea, y Cliff señaló que los dobles y los largos son efectivamente atómico en 64 bits JVM. Así que sí, el modelo de la memoria Java dice que estrictamente necesitamos volátiles para operaciones atómicas en longs pero en JVM de 64 bits que no es el caso. –

+3

@AmrishPandey * estas operaciones son atómicas en 64 bits JVM * ¿podría compartir enlaces de aprovisionamiento o leer más urls? – roottraveller

2

de programación Java modelo de memoria idioma, una sola escritura a un no el valor volátil largo o doble 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.

+0

** Puede ** ser dos escrituras separadas. – Pacerier

1

Java long y double no son atómicas en máquinas de 32 bits, sino atómicas 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 this para obtener información detallada.

0

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 referido 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.

+0

Por favor, edite su respuesta correctamente. –

Cuestiones relacionadas