AtomicXXX.lazySet (…) в терминах «происходит до ребер»

Что означает метод AtomicXXX.lazySet (значение) в терминах рёбер «происходит раньше», который используется в большинстве рассуждений JMM? Документация javadocs чиста в этом отношении, и в сообщении об ошибке Sun 6275329 говорится:

Семантика такова, что запись гарантированно не будет переупорядочена при любой предыдущей записи, но может быть переупорядочена с последующими операциями (или эквивалентно, может быть невидимым для других потоков) до тех пор, пока не произойдет какое-либо другое изменчивое действие записи или синхронизации).

Но это не рассуждение о кромках HB, поэтому меня это смущает. Означает ли это, что семантика lazySet () не может быть выражена в терминах ребер HB?

ОБНОВЛЕНИЕ : Постараюсь конкретизировать свой вопрос. Я могу использовать обычное изменчивое поле в следующем сценарии:

//thread 1: producer
...fill some data structure
myVolatileFlag = 1;

//thread 2: consumer
while(myVolatileFlag!=1){
   //spin-wait
}
...use data structure...

В этом сценарии использование «структуры данных» в потребителе является правильным, поскольку переменный флаг записи-чтения делает HB edge, гарантируя, что все записи в «структуру данных» производителем будут быть завершенным и видимым для потребителя. Но что, если я буду использовать AtomicInteger.lazySet / get вместо изменчивой записи / чтения в этом сценарии?

//thread 1: producer
...fill some data structure
myAtomicFlag.lazySet(1);

//thread 2: consumer
while(myAtomicFlag.get()!=1){
   //spin-wait
}
...use data structure...

будет ли это по-прежнему правильным? Могу ли я по-прежнему следить за видимостью значений «структуры данных» в потребительском потоке?

Это не вопрос «с воздуха» - я видел такой метод в коде LMAX Disruptor именно в этом сценарии, и я не понимаю, как чтобы доказать, что это правильно ...

17
задан BegemoT 28 September 2011 в 17:56
поделиться