Respuesta de Kerem Baydoğan tiene toda la razón. Solo quiero dar un ejemplo práctico sobre lo que nos ofrece la palabra clave volatile
.
En primer lugar, tenemos un contador, SMTH como
public class Counter {
private int x;
public int getX() { return x; }
public void increment() { x++; }
}
Y algunas tareas ejecutables que se incrementa el valor de x
@Override
public void run() {
for (N) {
int oldValue = counter.getX();
counter.increment();
int new value = counter.getX();
}
}
}
Con ninguna sincronización no va a ser interference between threads y simplemente no va a funcionar
la manera más simple de resolver esto:
public class Counter {
private int x;
public synchronized int getX() { return x; }
public synchronized void increment() { x++; }
}
realidad con el fin de forzar al sistema a romper, hago un Thread.sleep
antes de leer y escribir x
, imagínese es un BD o una enorme tarea de tratar.
Ahora, ¿para qué sirve volatile
? Hay un montón de buenos artículos de allí: volatile article o this question
sincronizar el acceso al recurso común es no la respuesta, pero es una buena opción para mantenga la bandera para detener las discusiones
que nuestra anterior Por ejemplo, imagina que queremos incrementar la variable hasta 100, de manera simple podría ser una bandera volatile boolean
. Ejemplo:
private volatile boolean stop;
@Override
public void run() {
while(!stop) {
int oldValue = counter.getX();
if (oldValue == 100) {
stop = true;
} else {
counter.increment();
int new value = counter.getX();
}
}
}
Esto funciona bien, pero, si se quita la palabra clave volatile
de la bandera, es posible encontrar y bucle infinito.
Para aclarar mi comentario duplicado automático "Posible": Las dos sugerencias anteriores no eran duplicados exactos; el mio es. Es importante que esta pregunta se resuelva como un duplicado ya que la respuesta seleccionada a esta pregunta es peligrosamente incorrecta al afirmar que la volatilidad solo afecta al campo declarado volátil; de hecho, una escritura y una lectura de cualquier variable volátil introduce una barrera de memoria completa. al igual que la sincronización entre dos hilos. –