2012-04-02 17 views
6

Estoy algo confundido ...¿Qué operaciones son operaciones atómicas

¿Es cierto que la lectura \ escritura de varios hilos de todos excepto de largo y doble son operaciones atómicas y es necesario utilizar volátil sólo con la larga y doble?

+1

¿Tiene una fuente ¿para esto? – paislee

Respuesta

8

Parece que te estás refiriendo a this section del JLS. Está garantizado para todos los tipos primitivos, excepto double y long, que todos los hilos verán algún valor que en realidad se escribió en esa variable. (Con double y long, los primeros cuatro bytes pueden haber sido escritos por un hilo, y los últimos cuatro bytes por otro hilo, como se especifica en esa sección del JLS.) Pero no necesariamente verán el mismo valor en al mismo tiempo, a menos que la variable esté marcada como volatile.

Incluso utilizando volatile, x += 3 no es atómica, porque es x = x + 3, que hace una lectura y una escritura, y podría haber escribe a x entre la lectura y la escritura. Es por eso que tenemos cosas como AtomicInteger y las otras utilidades en java.util.concurrent.

0

Eso no suena bien.

Una operación atómica es aquella que obliga a todos los subprocesos a esperar para acceder a un recurso hasta que se hace otro subproceso con él. No veo por qué otros tipos de datos serían atómicos, y otros no.

3

No confundamos atomic con thread-safe. Las escrituras largas y dobles no son atómicas debajo porque cada una es dos tiendas separadas de 32 bits. Almacenar y cargar campos no largos/dobles son perfectamente atómicos suponiendo que no son escrituras compuestas (i++ por ejemplo).

Por Atomic quiero decir que no leerá ningún objeto ilegible como resultado de muchos hilos que escriben objetos diferentes en el mismo campo.

De Java Concurrency In Practice 3.1.2

Out-of-delgada-aire de seguridad: Cuando un hilo lee una variable sin sincronización, puede ver un valor rancio, pero al menos se ve un valor que en realidad fue colocado allí por algún hilo en lugar de algún valor aleatorio . Esto es cierto para todas las variables, excepto de 64 bits de longitud y doble, que no son volátiles. La JVM tiene permitido tratar de 64 bits de lectura o escritura como dos operaciones separadas de 32 bits que no son atómicas.

0

volátil tiene otras semántica que sólo escribir el valor atómicamente

significa que otros hilos pueden ver el valor actualizado de inmediato (y que no pueden ser optimizados a cabo)

Cuestiones relacionadas