Если поток B хочет видеть изменения, внесенные потоком A, может ли только последнее изменение быть изменчивой переменной в отличие от всех? - PullRequest
0 голосов
/ 26 сентября 2018

Я посмотрел на этот ответ , и он гласит:

При новой модели памяти, когда поток A записывает в переменную V переменную, а поток Bчитает из V, любые значения переменных, которые были видны A во время написания V, теперь гарантированно будут видны B.

Поэтому, учитывая пример:

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();
    }
}

Гарантируется ли изменение на value (от -1 до 1) быть видимым для потока b, несмотря на нестабильность value (только read)?

Если это так, учитываякуча изменений, которые выполняются с целью быть видимыми для другого потока, есть ли какая-либо цель сделать любую переменную, отличную от последней, изменчивой?

1 Ответ

0 голосов
/ 26 сентября 2018

Да, изменение на value гарантированно будет видимым для потока b.

JLS 17.4.4.Порядок синхронизации говорит:

  • Запись в энергозависимую переменную v (§8.3.1.4) синхронизируется с все последующие чтения v любым потоком (где «последующий» определяется в соответствии с порядком синхронизации).

JLS 17.4.5.Порядок «до и после» гласит:

С помощью отношения случай-до можно заказать два действия.Если одно действие происходит - до другого, то первое видно и упорядочено до второго.

Если у нас есть два действия x и y , мы пишем hb (x, y) , чтобы указать, что x происходит до y .

  • Если x и y являются действиями одного и того же потока, а x предшествует y в программном порядке, затем hb (x, y) .

  • Существует ребро , предшествующее , от конца конструктора объекта до начала финализатора (§12.6) для этого объекта.

  • Если действие x синхронизируется с следующим действием y , то у нас также есть hb (x, y) .

  • Если hb (x, y) и hb (y, z) , то hb (x, z) .

В пуле 1 говорится, что value = 1 происходит до read = true.
В пуле 3 говорится, что read = true случается до !read.
В пуле 1 говорится, что !read происходит до "Value: " + value.
В пуле 4 говорится, что value = 1 происходит до "Value: " + value.

...