В Java, когда у нас есть два потока, которые используют следующие переменные:
int a;
volatile int b;
если поток 1:
a = 5;
b = 6;
Затем между этими двумя инструкциями вставлен барьер StoreStore, а "a" сбрасывается обратно в основную память.
Теперь, если поток 2:
if(b == 6)
a++;
барьер LoadLoad вставлен между ними, и мы гарантируем, что если новое значение "b" будет видимым, тогда также будет видно новое значение "a". Но как на самом деле это достигается? Загружает ли LoadLoad кэширование/регистры процессора? Или просто инструктирует CPU для получения значений переменных, которые следуют за чтением из volatile снова из CPU?
Я нашел эту информацию о барьерах LoadLoad (http://gee.cs.oswego.edu/dl/jmm/cookbook.html):
Барьеры LoadLoad Последовательность: Load1; LoadLoad; Load2 гарантирует, что Данные Load1 загружаются до доступа к данным Load2 и всех загружаются последующие инструкции по загрузке. В общем, явный LoadLoad необходимы барьеры для процессоров, выполняющих спекулятивные нагрузки и/или обработки вне очереди, в которой инструкции ожидающей нагрузки могут байпасные магазины ожидания. О процессорах, гарантирующих всегда сохранение порядок загрузки, барьеры равны нулю.
но на самом деле это не объясняет, как это достигается.