¿El reordenamiento de Java afecta a System.currentTimeMillis()?
java-memory-model order-of-execution (2)
Según el modelo de memoria Java, las instrucciones se pueden reordenar siempre que la ejecución esté well-formed .
Así que me pregunto, ¿es posible que los siguientes códigos produzcan el siguiente resultado?
[códigos] [en un mismo hilo]
long a = System.currentTimeMillis();
long b = System.currentTimeMillis();
long c = System.currentTimeMillis();
[salida]
a == 10, b == 20, c == 15
Si no es posible, ¿qué hace JVM / implementaciones para evitar que esto suceda?
Debido a que es una llamada al sistema del usuario, los compiladores no deben reordenarlos en el mismo hilo. Si esto no fuera cierto, incluso podríamos experimentar efectos de reordenación en System.out.println (valores independientes); Supongo que el acceso al reloj del sistema / sistema operativo crea una especie de relación entre estas operaciones (siempre para el subproceso actual), por lo que teóricamente hay algún tipo de dependencia entre ellas. Probablemente, JVM considera este problema y nunca reordena las llamadas del sistema de usuario.
Por favor vea esta pregunta Reordenamiento de instrucciones y relación de suceso antes de java .
Creo que, a menos que esté en un hilo diferente, el resultado de cualquier ejecución siempre será consistente con el orden en su código. En esta situación, ya que es imposible procesarlo fuera de orden, debería ser bueno incluso si sus campos son visibles a otro hilo.