2011-01-21 24 views

Respuesta

80
  • todas las asignaciones de tipos primitivos, excepto por largos y dobles
  • todas las asignaciones de referencias
  • todas las asignaciones de las variables volátiles
  • todas las operaciones de java.concurrent.Atomic * clases

y tal vez algo más. Mira el jls.

Como se señala en los comentarios, atomicity no implica visibilidad. Entonces, mientras que otro hilo está garantizado para no ver un int parcialmente escrito, es posible que nunca vea el nuevo valor.

Las operaciones en larga y doble están en CPU comunes de 64 bit atomic as well, aunque no hay garantía. Vea también este feature request.

+18

Las asignaciones a longitudes y dobles 'volátiles' están garantizadas para ser atómicas: http://java.sun.com/docs/books/jls/third_edition/html/memory.html#17.7 –

+10

Además, tenga en cuenta que, si bien las operaciones son atómicas, la visibilidad de esas operaciones podría no estar garantizada en una aplicación multiproceso a menos que se tenga cuidado especial (los detalles aquí son * forma * complicados de describir en un comentario ...) – nos

+0

64 bit jvm, asignaciones largas y dobles también son atómicos .. –

4

En Java, se garantiza que la lectura y escritura de cantidades de 32 bits o menores serán atómicas.
Por atómico, nos referimos a que cada acción tiene lugar en un solo paso y no se puede interrumpir. Por lo tanto, cuando tenemos aplicaciones multiproceso, las operaciones de lectura y escritura son seguras para hilos y no necesitan sincronizarse.

Por ejemplo, el siguiente código es seguro para hilos:

public class ThreadSafe 
    { 
    private int x; 
    public void setX(int x) 
      { 
      this.x = x; 
      } 
    } 
+5

..thread safe en el sentido de que el valor siempre será exactamente el valor original o el valor establecido. El valor más actualizado todavía no es visible para otros hilos debido a la falta de "volátil" o "sincronizado". –

+1

+1 a lo que dice @MikkoWilkman. Esa pieza de código no debe utilizarse, ya que definitivamente no es segura para subprocesos desde la perspectiva de la visibilidad de la memoria. –

0

Sería parece que las asignaciones de posiciones largas son atómicas, sobre la base de este método en AtomicLong.java:

public final void set(long newValue) { 
    value = newValue; 
} 

Nota la ausencia de cualquier sincronización.

+3

Mire la declaración de 'valor'. Es 'volátil'. – maaartinus

+1

Ese 'valor' es' volátil' no hace que la asignación de 'valor' sea atómica, simplemente evita problemas de" publicación ". –

+6

Hace ambas cosas, consulte [JLS, sección 17.7] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7): escribe y lee de volátil largo y los valores dobles son siempre atómicos. – maaartinus

Cuestiones relacionadas