Java重新排序会影响System.currentTimeMillis()吗?

根据Java Memory Model,只要执行结构良好 ,指令就可以重新排序。

所以我想知道,以下代码是否可能产生以下输出?

[代码] [在同一个主题中]

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

[输出]

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

如果不可能,那么JVM /实现会做些什么来防止这种情况发生?

请参阅此问题指令重新排序和发生在java之前的关系 。

我相信,除非您处于不同的线程中,否则任何执行的结果将始终与代码中的顺序一致。 在这种情况下,由于无法按顺序处理它,即使您的字段对另一个线程可见,它也应该是好的。

由于是用户系统调用,编译器不应该在同一个线程中重新排序它们。 如果不是这样,我们甚至可以在System.out.println(独立值)中体验重新排序效果; 我想对System / OS时钟的访问会在这些操作之间创建一种关系(总是针对当前线程),所以理论上它们之间存在某种依赖关系。 可能JVM会考虑此问题,并且永远不会重新排序用户系统调用。