【发布时间】:2018-07-19 04:37:39
【问题描述】:
前段时间有人问过一个有趣的question:
Can (a == 1 && a == 2 && a == 3) evaluate to true in Java?
我决定证明使用 Java 8 Stream API(确切地说是并行流)是可能的。这是我在极少数情况下有效的代码:
class Race {
private static int a;
public static void main(String[] args) {
IntStream.range(0, 100_000).parallel().forEach(i -> {
a = 1;
a = 2;
a = 3;
testValue();
});
}
private static void testValue() {
if (a == 1 && a == 2 && a == 3) {
System.out.println("Success");
}
}
}
然后我想,也许是因为潜在的 JIT 编译器优化?因此,我尝试使用以下 VM 选项运行代码:
-Djava.compiler=NONE
我禁用了JIT,成功案例的数量明显增加了!
即时编译器如何优化并行流,以便优化可能影响上述代码执行?
【问题讨论】:
-
你忘了
avolatile,这就是这里的区别,而不是流
标签: java parallel-processing jvm java-stream jit