Что означает метод 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, предоставляя гарантию того, что все записи в "структуру данных" производителя будут завершены и видны потребителю. Но что, если я буду использовать AtomicInteger.lazySet/get вместо volatile write/read в этом сценарии?
//thread 1: producer
...fill some data structure
myAtomicFlag.lazySet(1);
//thread 2: consumer
while(myAtomicFlag.get()!=1){
//spin-wait
}
...use data structure...
будет ли он по-прежнему правильным? Могу ли я по-прежнему наглядно видеть значения "структуры данных" в потребительском потоке?
Это не вопрос "из воздуха" - я видел такой метод в коде LMAX Disruptor именно в этом сценарии, и я не понимаю, как доказать, что это правильно...