Если Поток 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
,