Подтвердить что ты не робот

Неустойчивые переменные и другие переменные

Ниже из классического Concurency in Practice:

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

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

4b9b3361

Ответ 1

Ответ на ваш вопрос находится в JLS # 17.4.5:

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

Итак, если в одном потоке вы

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

И затем в другом потоке:

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

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

Более подробно это связано с двумя другими гарантиями, предоставленными моделью памяти Java (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 гарантирует, что все исполнения программы будут последовательно согласованы (т.е. будут выглядеть так, как будто ничего не было переупорядочено), если они правильно синхронизированы с событиями-до отношений. Таким образом, в этом конкретном случае в режиме энергонезависимого чтения гарантируется эффект от энергонезависимой записи.

Ответ 2

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

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