Aquí es un muy buen ejemplo que ilustra el tema de la prohibición de reordenamiento está dirigido a tratar (tomado de here):
class VolatileExample {
int x = 0;
volatile boolean v = false;
public void writer() {
x = 42;
v = true;
}
public void reader() {
if (v == true) {
//uses x - guaranteed to see 42.
}
}
}
En este ejemplo, v
es volátil, pero no es x
. Si el escritor y el lector se ejecutan al mismo tiempo y el lector ve v
establecido en true
, x
se garantiza que es 42
. Antes de Java 5, compilador era libre de volver a ordenar las escrituras en x
y v
, por lo que podía ver x
en cero después de has visto v
conjunto de true
. Esto fue confuso y condujo a errores sutiles. El modelo de memoria Java-5 solucionó este problema al hacer que las escrituras volátiles fueran casi equivalentes a la sincronización.
Tenga en cuenta que esto acerca de las lecturas volátiles evita las cachés es una construcción puramente teórica y realmente no tiene mucho que ver con lo que 'volátil 'realmente tiene en el hardware real. Simplemente imaginamos que hay todo tipo de cosas que una implementación podría hacer y que 'volátil 'garantiza que las optimizaciones no producen comportamientos particulares que debemos prohibir en casos particulares. –