不会检查while循环开头的条件语句

时间:2015-08-04 23:52:03

标签: java while-loop

我注意到了这个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进行了测试。

1 个答案:

答案 0 :(得分:3)

我怀疑您点击了名为hoisting的编译器优化 - 它识别出您在没有这些更改的情况下覆盖value并且#34;可见"到其他线程,这就是为什么它在某些时候优化并停止打印。

此行为将改变为"想要"行为一旦你将value声明为volatile - 然后其他线程就会看到对它的更新,然后打印会一直持续。