He mirado en esta respuesta , y recoge la forma de:
Bajo el nuevo modelo de memoria, cuando el hilo A escribe a una variable volátil V, y el hilo B se lee de V, los valores de variables que eran visibles a A en el momento en que V fue escrito están garantizados ahora para ser visible a B.
Por lo tanto, dado el ejemplo:
public class Main {
static int value = -1;
static volatile boolean read;
public static void main(String[] args) {
Thread a = new Thread(() -> {
value = 1;
read = true;
});
Thread b = new Thread(() -> {
while (!read);
System.out.println("Value: " + value);
});
a.start();
b.start();
}
}
Es el cambio a value
(de -1 a 1) garantiza que sea visible para enhebrar b a pesar de la no volatilidad de value
(sólo read
)?
Si es así, dado un montón de cambios que se lleva a cabo con la intención de ser visible para otro hilo, ¿hay algún propósito en la toma de cualquier variable cambiado que no sea el último volátil?
Sí, el cambio value
se garantiza que sea visible para el hilo b.
JLS 17.4.4. Sincronización Solicitar dice:
- Una escritura a una variable volátil v (§8.3.1.4) sincroniza-con todos los posteriores lecturas de v por cualquier hilo (donde "posterior" se define de acuerdo con el orden de sincronización).
JLS 17.4.5. Sucede-antes de la orden dice:
Dos acciones pueden ser ordenados por un pasa-antes de relación. Si una acción sucede antes otra, entonces el primero es visible para y pedidas antes de la segunda.
Si tenemos dos acciones x e y , se escribe HB (x, y) para indicar que x sucede antes y .
Si X y Y son acciones de la misma rosca y x está antes y el fin del programa, a continuación, HB (x, y) .
Hay un pasa-antes borde del final de un constructor de un objeto con el inicio de un finalizador (§12.6) para ese objeto.
Si una acción x-sincroniza con una acción siguiente y , a continuación, que también tienen Hb (x, y) .
Si hb (x, y) y Hb (y, z) , entonces hb (x, z) .
Bala 1 dice que value = 1
suceda antes read = true
.
Punto 3 dice que read = true
suceda antes !read
.
Bala 1 dice que !read
suceda antes "Value: " + value
.
Bala 4 dice que value = 1
suceda antes "Value: " + value
.