根据Java Memory Model,只要执行well-formed,指令就可以重新排序。
所以我想知道,以下代码是否可能产生以下输出?
[代码] [在同一个主题中]
long a = System.currentTimeMillis();
long b = System.currentTimeMillis();
long c = System.currentTimeMillis();
[输出]
a == 10, b == 20, c == 15
如果不可能,那么JVM /实现会做些什么来防止这种情况发生?
答案 0 :(得分:5)
请参阅此问题Instruction reordering & happens-before relationship in java。
我相信除非你在不同的线程中,否则执行的结果将始终与代码中的顺序一致。在这种情况下,由于无法按顺序处理它,即使你的字段对另一个线程可见,它也应该是好的。
答案 1 :(得分:1)
由于是用户系统调用,编译器不应在同一个线程中对它们重新排序。如果不是这样,我们甚至可以在System.out.println(独立值)中体验重新排序效果; 我想对System / OS时钟的访问会在这些操作之间产生一种关系(总是针对当前线程),所以理论上它们之间存在某种依赖关系。可能JVM会考虑此问题,并且永远不会重新排序用户系统调用。