В Java, когда мы имеем два потока обмена следующие переменные:Что действительно делает барьер LoadLoad?
int a;
volatile int b;
если поток 1 делает:
a = 5;
b = 6;
Затем StoreStore барьер вставляется между этими двумя инструкциями и «а» быть сбрасывается обратно в основную память.
Теперь, если поток 2 делает:
if(b == 6)
a++;
LoadLoad барьер вставляется между ними и есть гарантия, что если новое значение «Ъ» видна, то новое значение «а» видна, а , Но как на самом деле это достигается? Загружает ли LoadLoad кэширование/регистры процессора? Или просто инструктирует CPU для получения значений переменных, которые следуют за чтением из volatile снова из CPU?
Я нашел эту информацию о LoadLoad барьере (http://gee.cs.oswego.edu/dl/jmm/cookbook.html):
LoadLoad барьеры Последовательность: LOAd1; LoadLoad; Load2 гарантирует, что Данные Load1 загружаются до того, как данные будут загружены с помощью Load2, и загрузятся последующие инструкции по загрузке . В общем случае явные барьеры LoadLoad необходимы для процессоров, которые выполняют спекулятивные нагрузки и/или обработку вне очереди, в которых команды ожидания нагрузки могут хранилища ожидания обхода. На процессорах, которые гарантируют сохранение порядка загрузки , барьеры равны нулю.
, но на самом деле это не объясняет, как это достигается.
Ответ зависит от архитектуры процессора - в том же документе есть таблица с каждой инструкцией процессора, которая показывает, что 'LoadLoad' - нет-op на x86, например. – assylias
тогда как это работает вообще? Я имею в виду, что после StoreStore значения будут сброшены обратно в память. Но тогда как поток 2 должен их видеть? Если этот LoadLoad имеет значение no-op, то поток 2 может продолжать использовать кешированные значения. – Janek
, потому что модель памяти процессора достаточно сильна, что гарантирует, что это будет так. Я пытаюсь сказать, что Java дает обещание, что если вы будете использовать volatile, что-то произойдет или не произойдет. Как это реализовано в JVM, зависит от процессора и использует специальные инструкции (или нет инструкции, если это необходимо). Подробнее о точке LoadLoad/x86 можно прочитать здесь: http://altair.cs.oswego.edu/pipermail/concurrency-interest/2012-July/009615.html – assylias