Случаются ли раньше отношения с изменчивыми полями и синхронизированными блоками в Java - и их влияние на энергонезависимые переменные?
Я все еще довольно новичок в концепции многопоточности и пытаюсь понять больше об этом. Недавно я наткнулся на пост в блогеЧто означает изменчивое в Java Джереми Мэнсон, где он пишет:
Когда один поток пишет в переменную, а другой видит эту запись, первый сообщает второмувсе содержимого памяти до тех пор, пока не будет выполнена запись в эту переменную. [...]все содержимого памяти, увиденного потоком 1, прежде чем он записал[volatile] ready
, должен быть виден потоку 2, после того как он прочитает значениеtrue
заready
, [Акцент добавлен мной]
Теперь, означает ли это, что все переменные (volatile или нет), хранящиеся в памяти потока 1 во время записи в переменную volatile, станут видимыми для потока 2 после того, как он прочитает эту переменную volatile? Если так,возможно ли смешать это утверждение из официальной документации Java / источников Oracle? И с какой версии Java это будет работать?
В частности, если все потоки имеют следующие переменные класса:
private String s = "running";
private volatile boolean b = false;
И Поток 1 сначала выполняет следующее:
s = "done";
b = true;
Затем выполняется поток 2 (после того, как поток 1 записал в поле volatile):
boolean flag = b; //read from volatile
System.out.println(s);
Будет ли гарантировано печатать «готово»?
Что будет, если вместо декларацииb
какvolatile
Я положил написать и читать вsynchronized
блок?
Кроме того, в дискуссии под названием "Распределены ли статические переменные между потоками?"@TREEпишет:
Не используйте volatile для защиты более одного общего состояния.
Почему? (Извините, я не могу пока комментировать другие вопросы, или я бы спросил там ...)