Если Поток B хочет видеть изменения, которые вносит Поток A, может ли только последнее изменение быть изменчивой переменной в отличие от всех?

Я посмотрел на этот ответ, и он утверждает, как:

Согласно новой модели памяти, когда поток 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 ответ

Решение

Да, изменение на value гарантированно будет виден нити б.

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,

Другие вопросы по тегам