Подтвердить что ты не робот

Является ли переупорядочение Java влияющим на System.currentTimeMillis()?

В соответствии с моделью памяти Java инструкции могут быть переупорядочены до тех пор, пока выполнение правильно сформировано.

Так интересно, возможно ли, что следующие коды выдают следующий вывод?

[коды] [в той же теме]

long a = System.currentTimeMillis();
long b = System.currentTimeMillis();
long c = System.currentTimeMillis();

[выход]

a == 10, b == 20, c == 15

Если это невозможно, то что делает JVM/реализации для предотвращения этого?

4b9b3361

Ответ 1

Пожалуйста, ознакомьтесь с этим вопросом Переупорядочение инструкций и происходит до отношений в java.

Я считаю, что если вы не в другом потоке, результат любого исполнения всегда будет соответствовать порядку в вашем коде. В этой ситуации, поскольку невозможно обработать его из строя, оно должно быть хорошим, даже если ваши поля видны другому потоку.

Ответ 2

Из-за системного вызова пользователя компиляторы не должны переупорядочивать их в одном потоке. Если это было неверно, мы могли бы даже испытывать переупорядочивающие эффекты в System.out.println(независимые значения); Я предполагаю, что доступ к часам системы/ОС создает некоторую взаимосвязь между этими операциями (всегда для текущего потока), поэтому теоретически существует какая-то зависимость между ними. Вероятно, JVM рассматривает эту проблему и никогда не переупорядочивает вызовы системы пользователей.