Что означает метод 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 именно в этом сценарии, и я не понимаю, как чтобы доказать, что это правильно ...