Я столкнулся со следующим утверждением: «Чтение или запись в изменчивую переменную накладывает барьер памяти, при котором весь кеш очищается / становится недействительным».
Теперь рассмотрим следующий сценарий выполнения:
начальный volatile boolean barrier;
начальный int b = 0;
поток 1 b = 1; // write1
поток 1 barrier = true; // write2
поток 2 barrier = true; // write3
поток 2 print(b); // r1
Вопрос: гарантированно ли поток 2 напечатает 1?
Основываясь на заявлении, я бы ответил утвердительно: поток 1 очищает свой кеш на write2 (так, чтобы b = 1
попал в основную память), а поток 2 аннулирует свой кеш на write3 (так что он будет читать b
из основной памяти).
Однако в соответствующем Разделы JLS Я не могу найти гарантии для такого поведения, поскольку write3 - это запись, а не чтение. Таким образом, следующий, казалось бы, важный пункт не применяется:
Запись в изменчивую переменную v (§8.3.1.4) синхронизируется со всеми последующими чтениями v любым потоком (где «последующие» определены в соответствии с порядком синхронизации).
Есть ли какая-то другая информация, которую мне не хватает, или я что-то неправильно понимаю?
(Актуальные вопросы:
write3
в потоке 2 произойдет послеwrite1
в потоке 1? Если вы можете гарантировать, что записи происходят в этом порядке, тогда, я думаю,b == 1
будет отображаться в потоке 2. - person jepio   schedule 14.01.2015