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

时间:2014-12-25 03:42:16

标签: java java-memory-model order-of-execution

根据Java Memory Model,只要执行well-formed,指令就可以重新排序。

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

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

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

[输出]

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

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

2 个答案:

答案 0 :(得分:5)

请参阅此问题Instruction reordering & happens-before relationship in java

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

答案 1 :(得分:1)

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