Si el hilo B desea ver cambios enhebrar una marcas, sólo puede ser el último cambio en una variable volátil en contraposición a todos?

Mario Ishac :

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?

Andreas:

Sí, el cambio valuese 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 .

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=187693&siteId=1
Recomendado
Clasificación