Является ли переупорядочение Java влияющим на System.currentTimeMillis()?
В соответствии с моделью памяти Java инструкции могут быть переупорядочены до тех пор, пока выполнение правильно сформировано.
Так интересно, возможно ли, что следующие коды выдают следующий вывод?
[коды] [в той же теме]
long a = System.currentTimeMillis();
long b = System.currentTimeMillis();
long c = System.currentTimeMillis();
[выход]
a == 10, b == 20, c == 15
Если это невозможно, то что делает JVM/реализации для предотвращения этого?
Ответы
Ответ 1
Пожалуйста, ознакомьтесь с этим вопросом Переупорядочение инструкций и происходит до отношений в java.
Я считаю, что если вы не в другом потоке, результат любого исполнения всегда будет соответствовать порядку в вашем коде. В этой ситуации, поскольку невозможно обработать его из строя, оно должно быть хорошим, даже если ваши поля видны другому потоку.
Ответ 2
Из-за системного вызова пользователя компиляторы не должны переупорядочивать их в одном потоке. Если это было неверно, мы могли бы даже испытывать переупорядочивающие эффекты в System.out.println(независимые значения);
Я предполагаю, что доступ к часам системы/ОС создает некоторую взаимосвязь между этими операциями (всегда для текущего потока), поэтому теоретически существует какая-то зависимость между ними. Вероятно, JVM рассматривает эту проблему и никогда не переупорядочивает вызовы системы пользователей.