Спецификация 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 для архитектур, поддерживающих такое умозрительное выполнение, должны гарантировать, что оно ограничено переменными, не видимыми другими потоками (или полностью его отключить).

Другие вопросы по тегам