По сравнению с MemoryBarrier()
, Java происходит до - гораздо более острый инструмент, оставляя больше возможностей для агрессивной оптимизации при сохранении безопасности потоков.
Более острый инструмент, как и следовало ожидать, также требует большей осторожности для правильного использования, и именно так может быть описана семантика доступа к переменной volatile
. Вы должны написать переменную volatile
на сайте записи и , прочитанную с одного и того же volatile на каждом сайте для чтения. Подразумевается, что у вас может быть любое количество независимых локализованных «барьеров памяти», по одному на переменную volatile
, и каждый защищает только состояние, доступное из этой переменной.
Полную идиому обычно называют «безопасная публикация» (хотя это более общий термин) и подразумевает заполнение неизменяемого графа объектов, который будет разделяться между потоками, а затем записывать ссылку на него в переменную volatile
.