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

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

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

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