Изменчивые переменные и другие переменные

Следующее из классической Concurency in Practice:

Когда поток A записывает в переменную volatile и впоследствии поток B читает ту же самую переменную, значения всех переменных, которые были видны A до записи в переменную volatile, становятся видимыми для B после считывания переменной volatile.

Я не уверен, что могу действительно понять это утверждение. Например, каково значение всех переменных в этом контексте? Означает ли это, что использование volatile также имеет побочные эффекты от использования энергонезависимых переменных?
Мне кажется, что это утверждение имеет какой-то тонкий смысл, который я не могу понять.
Любая помощь?

2 ответа

Решение

Ответ на ваш вопрос в JLS # 17.4.5:

Запись в энергозависимое поле (§8.3.1.4) происходит перед каждым последующим чтением этого поля.

Так что если в одной ветке у вас есть

aNonVolatileVariable = 2 //w1
aVolatileVariable = 5 //w2

И впоследствии в другой теме:

someVariable = aVolatileVariable //r1
anotherOne = aNonVolatileVariable //r2

У вас есть гарантия того, что anotherOne будет равен 2, даже если эта переменная не является изменчивой. Так что да, использование volatile также имеет побочные эффекты от использования энергонезависимых переменных.

Более подробно, это связано с двумя другими гарантиями, предоставляемыми Java Memory Model (JMM) в этом же разделе: порядок внутри потока и транзитивность (hb(x,y) означает, что x происходит раньше, чем y):

Если x и y являются действиями одного и того же потока и x предшествует y в программном порядке, то hb(x,y).
[...]
Если hb(x,y) и hb (y, z), то hb (x, z).

В моем примере:

  • hb (w1, w2) и hb (r1, r2) (внутрипотоковая семантика)
  • hb (w2, r1) из-за нестабильной гарантии

так что вы можете сделать вывод, что hb(w1, r2) по транзитивности.

И JMM гарантирует, что все исполнения программы будут последовательно согласованы (то есть будут выглядеть, как будто ничего не было переупорядочено), если она будет правильно синхронизирована с отношениями "до". Таким образом, в этом конкретном случае энергонезависимое чтение гарантированно увидит эффект энергонезависимой записи.

Это означает, что если вы записываете в десять энергонезависимых переменных и записываете в энергозависимые, все энергонезависимые переменные должны быть установлены до энергозависимых.

Если вы прочитаете переменную volatile и все энергонезависимые переменные, вы можете быть уверены, что порядок не будет изменен.

Другие вопросы по тегам