Java while循环开头的条件语句不';不要检查
我注意到了这个bug(如果它是bug的话),并决定创建一个测试环境。有人知道这是一个真正的问题还是只有我一个人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
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
调用改变行为的原因……我做到了,我理解。谢谢你的帮助!打印会改变行为,因为底层流是同步的,因此会强制线程同步。