En el libro de Effective Java, dice:
La especificación del lenguaje garantiza que leer o escribir una variable es atómica a menos que la variable sea de tipo
long
odouble
[JLS, 17.4.7].
¿Qué significa "atómico" en el contexto de la programación Java, o la programación en general?
volatile long
ovolatile double
hace que la lectura atómica y la escritura atómica.Respuestas:
Aquí hay un ejemplo, porque un ejemplo a menudo es más claro que una explicación larga. Supongamos que
foo
es una variable de tipolong
. La siguiente operación no es una operación atómica:De hecho, la variable se escribe utilizando dos operaciones separadas: una que escribe los primeros 32 bits y otra que escribe los últimos 32 bits. Eso significa que otro hilo podría leer el valor de
foo
y ver el estado intermedio.Hacer que la operación sea atómica consiste en utilizar mecanismos de sincronización para asegurarse de que la operación se vea, desde cualquier otro hilo, como una operación única, atómica (es decir, no dividible en partes). Eso significa que cualquier otro subproceso, una vez que la operación se vuelva atómica, verá el valor
foo
antes o después de la asignación. Pero nunca el valor intermedio.Una manera simple de hacer esto es hacer que la variable sea volátil :
O para sincronizar cada acceso a la variable:
O para reemplazarlo con un
AtomicLong
:fuente
"Operación atómica" significa una operación que parece ser instantánea desde la perspectiva de todos los otros hilos. No necesita preocuparse por una operación parcialmente completa cuando se aplica la garantía.
fuente
Es algo que "parece que el resto del sistema ocurre instantáneamente" y se clasifica en la categorización de linealización en los procesos informáticos. Para citar aún más ese artículo vinculado:
Entonces, por ejemplo, en el contexto de un sistema de base de datos, uno puede tener 'compromisos atómicos', lo que significa que puede enviar un conjunto de cambios de actualizaciones a una base de datos relacional y esos cambios se enviarán todos o ninguno de ellos en absoluto En caso de falla, de esta manera los datos no se corrompen, y como consecuencia de bloqueos y / o colas, la siguiente operación será una escritura o lectura diferente, pero solo después del hecho. En el contexto de variables y subprocesos, esto es muy similar, aplicado a la memoria.
Su cita destaca que este comportamiento no tiene que ser esperado en todos los casos.
fuente
Acabo de encontrar una publicación de Operaciones atómicas frente a operaciones no atómicas que me fue muy útil.
fuente
Si tiene varios subprocesos ejecutando los métodos m1 y m2 en el siguiente código:
tiene la garantía de que cualquier llamada de hilo
m2
leerá 0 o 5.Por otro lado, con este código (donde
i
es largo):una llamada de subproceso
m2
podría leer 0, 1234567890L o algún otro valor aleatorio porquei = 1234567890L
no se garantiza que la declaración sea atómica para along
(una JVM podría escribir los primeros 32 bits y los últimos 32 bits en dos operaciones y un subproceso podría observari
en el medio) .fuente
En Java, la lectura y escritura de campos de todo tipo, excepto long y double, se produce atómicamente, y si el campo se declara con el modificador volátil, incluso long y double se leen y escriben atómicamente. Es decir, obtenemos el 100% de lo que estaba allí o de lo que sucedió allí, ni puede haber ningún resultado intermedio en las variables.
fuente