19

根据 Java 内存模型,只要执行格式良好,指令就可以重新排序。

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

[代码][在同一个线程中]

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

[输出]

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

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

4

2 回答 2

5

请参阅这个问题指令重新排序和发生在 java 中的关系

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

于 2014-12-25T04:01:35.747 回答
0

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

于 2014-12-25T08:50:41.210 回答