¿Es un int volatile en Java thread-safe?

¿Es un int volatile en Java thread-safe? Es decir, ¿se puede leer y escribir de forma segura sin locking?

Sí, puede leer y escribir de forma segura, pero no puede hacer nada compuesto, como boostlo de forma segura, ya que es un ciclo de lectura / modificación / escritura. También está la cuestión de cómo interactúa con el acceso a otras variables.

La naturaleza precisa de la volatilidad es francamente confusa (ver la sección de modelo de memoria de la JLS para más detalles ). Personalmente, en general usaría AtomicInteger como una forma más sencilla de asegurarme de que lo hago bien.

[…] como para poder leer y escribir de forma segura sin bloquear?

Sí, una lectura siempre dará como resultado el valor de la última escritura, (y tanto las lecturas como las escrituras son operaciones atómicas).

Una lectura / escritura volátil introduce una llamada relación de pasar antes en la ejecución.

De la Especificación de Lenguaje Java Capítulo 17: Hilos y Cerraduras

Una escritura en un campo volátil (§8.3.1.4) ocurre, antes de cada lectura posterior de ese campo.

En otras palabras, cuando se trata de variables volátiles, no tiene que sincronizar explícitamente (introducir una relación de pase antes) usando synchronized palabra clave synchronized para asegurarse de que el hilo obtenga el último valor escrito en la variable.

Sin embargo, como señala Jon Skeet, el uso de variables volátiles es limitado, y en general debería considerar usar clases del paquete java.util.concurrent .

El acceso a volatile int en Java será seguro para subprocesos. Cuando digo acceso me refiero a la operación de la unidad sobre él, como volatile_var = 10 o int temp = volatile_var (básicamente escribir / leer con valores constantes). La palabra clave volátil en Java garantiza dos cosas:

  1. Cuando lee, siempre obtiene el valor en la memoria principal. En general, para fines de optimización, la JVM utiliza registros o, en términos más generales, variables de almacenamiento / acceso de la memoria local . Por lo tanto, en un entorno de subprocesos múltiples, cada subproceso puede ver una copia diferente de la variable. Pero volviéndolo volátil asegura que la variable write to variable se vacíe en la memoria principal y que también se lea en la memoria principal y, por lo tanto, asegúrese de que el hilo vea la copia correcta de la variable.
  2. El acceso al volátil se sincroniza automáticamente. Entonces, JVM asegura un orden mientras lee / escribe en la variable.

Sin embargo, Jon Skeet menciona correctamente que en operaciones no atómicas (volatile_var = volátil + 1) diferentes hilos pueden obtener resultados inesperados.