Случаются ли раньше отношения с изменчивыми полями и синхронизированными блоками в Java - и их влияние на энергонезависимые переменные?
Я все еще довольно новичок в концепции многопоточности и пытаюсь понять больше об этом. Недавно я наткнулся на пост в блогеЧто означает изменчивое в Java Джереми Мэнсон, где он пишет:
Когда один поток пишет в переменную, а другой видит эту запись, первый сообщает второмувсе содержимого памяти до тех пор, пока не будет выполнена запись в эту переменную. [...]все содержимого памяти, увиденного потоком 1, прежде чем он записал[volatile] ready
, должен быть виден потоку 2, после того как он прочитает значениеtrue
заready
, [Акцент добавлен мной]
Теперь, означает ли это, что все переменные (изменчивые или нет), хранящиеся в потоке 1 's память во время записи в переменную 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пишет:
Дон»t использовать volatile для защиты более одного общего состояния.
Зачем? (Извините, я могуНе комментируйте пока другие вопросы, иначе я бы там спросил ...)