Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java while循环开头的条件语句不';不要检查_Java_While Loop - Fatal编程技术网

Java while循环开头的条件语句不';不要检查

Java while循环开头的条件语句不';不要检查,java,while-loop,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

我注意到了这个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");
}
它开始滥发“完成”的信息。有人知道怎么回事吗?
注意:在使用jdk 1.8.0 v.25和jre 1.8.0 v.51时,我已经在Eclipse环境和编译的jar中对此进行了测试。

我怀疑您遇到了一个名为的编译器优化-它识别出您覆盖了
值,而这些更改“不可见”对于其他线程,这就是为什么它会在某个点进行优化并停止打印


一旦您将
value
声明为
volatile
,此行为将更改为可能的“想要的”行为-然后其他线程可以看到它的更新,然后打印将永远持续。

您正在比赛。将值声明为volatile,但这仍然不能使此代码正确。您可能需要查看此声明,将其声明为volatile并修复它。按预期运行。谢谢。@Noah我仍然建议阅读我链接的帖子,以了解
System.out.println
调用改变行为的原因……我做到了,我理解。谢谢你的帮助!打印会改变行为,因为底层流是同步的,因此会强制线程同步。