Случаются ли раньше отношения с изменчивыми полями и синхронизированными блоками в 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 для защиты более одного общего состояния.

Почему? (Извините, я не могу пока комментировать другие вопросы, или я бы спросил там ...)

Ответы на вопрос(3)

Ваш ответ на вопрос