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 会考虑这个问题,并且从不对用户系统调用进行重新排序。


推荐