Спецификация Java: читает, видит, пишет, что происходит позже в порядке выполнения
Я сейчас читаю Спецификацию языка Java.
§17.4.5-1
сказал
В этом исполнении операции чтения и записи происходят позже в порядке выполнения. Это может показаться нелогичным, но это допускается последовательностью "до и после". Разрешение операций чтения для просмотра последующих записей иногда может привести к недопустимому поведению.
§17.4.8-1
сказал
Хотя разрешение операций чтения для просмотра записей, которые приходят позже в порядке выполнения, иногда нежелательно, это также иногда необходимо.
Также 17.4.8-1 приводит странный пример.
Почему может reads see writes come later
возможный?
Если это действительно возможно, как я могу воспроизвести его в коде Java?
РЕДАКТИРОВАТЬ
Это не дублирующий вопрос. Этот вопрос только что задан 17.4.5-1, я могу понять 17.4.5-1, потому что компилятор может изменить их порядок. Но как насчет 17.4.8-1? Это под Executions and Causality Requirements
, Согласно определению execution order
Никто не может изменить порядок
r1 = x; // write
а также
if (r1 != 0) // read
Чтобы y = 1
должно случиться последним.
1 ответ
Пример
Table 17.4.8-A Thread 1 Thread 2 r1 = x; r2 = y; if (r1 != 0) y = 1; if (r2 != 0) x = 1;
возможно на архитектуре, которая имеет спекулятивное исполнение. Таким образом, ЦП встречает условную ветвь, когда запрошенное из основной памяти значение еще не поступило, и решает выполнить условный код и откатить его в случае, если условие не выполнено.
Когда значение поступает в ядро ЦП, это значение записывается другим потоком, поэтому условие выполняется и изменения сохраняются.
Вы не можете воспроизвести это в коде Java, поскольку в спецификации продолжается объяснение, что такой сценарий не разрешен для кода Java. Это пример того, что было бы разрешено, если бы у нас было такое - до согласованности. Но Java дополнительно запрещает "из воздуха ценности". Таким образом, реализации JVM для архитектур, поддерживающих такое умозрительное выполнение, должны гарантировать, что оно ограничено переменными, не видимыми другими потоками (или полностью его отключить).