我注意到了这个bug(如果它是一个bug),并决定建立一个测试环境。有谁知道这是一个实际问题还是仅仅是我?
import java.util.Random;
public class Start {
public static boolean value;
public static void main(String[] args){
Thread thread = new Thread(){
@Override
public void run(){
random();
}
};
thread.start();
while(true){
if(value) System.out.println("Done");
}
}
public static void random(){
while(true){
value = new Random().nextInt(5) == 0;
}
}
}
我希望这段代码能够将“完成”垃圾邮件发送出去,但我会在开始时收到一堆然后没有添加内容。当我修改代码时:
while(true){
System.out.print(""); //Modification
if(value) System.out.println("Done");
}
它开始垃圾邮件“完成”。谁知道怎么了? 注意:我在Eclipse环境和编译的jar中使用jdk 1.8.0 v.25和jre 1.8.0 v.51进行了测试。
答案 0 :(得分:3)
我怀疑您点击了名为hoisting的编译器优化 - 它识别出您在没有这些更改的情况下覆盖value
并且#34;可见"到其他线程,这就是为什么它在某些时候优化并停止打印。
此行为将改变为"想要"行为一旦你将value
声明为volatile
- 然后其他线程就会看到对它的更新,然后打印会一直持续。