Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.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 System.out.println(“输出”)更改程序的行为_Java_While Loop - Fatal编程技术网

Java System.out.println(“输出”)更改程序的行为

Java System.out.println(“输出”)更改程序的行为,java,while-loop,Java,While Loop,我有以下代码: boolean running=true; (跑步时){ MathStackJPanel focused=Main.frame.mainPanel.focused; //系统输出打印(“”); 如果(聚焦!=null){ 点p=聚焦。getMousePosition(); 表达式分量ep=聚焦。获取下点(p); } } focused.getUnderPoint(p)应该打印一些东西(用于调试),但不打印。只要我取消注释System.out.print(“”),代码就会按预期工

我有以下代码:

boolean running=true;
(跑步时){
MathStackJPanel focused=Main.frame.mainPanel.focused;
//系统输出打印(“”);
如果(聚焦!=null){
点p=聚焦。getMousePosition();
表达式分量ep=聚焦。获取下点(p);
}
}
focused.getUnderPoint(p)
应该打印一些东西(用于调试),但不打印。只要我取消注释
System.out.print(“”
),代码就会按预期工作,并且我会在控制台中看到打印的内容(从
focused.getUnderPoint(p)
)。为什么这个简单的行实际上什么都不做,却完全修改了我代码的行为?另外,我可以看出while循环中的代码根本没有运行,因为在特定场景中,当我取消注释
System.out.print(“”
时,会抛出一个异常(如预期的那样)

java是否优化了我的while循环,即使它不应该这样做

有人要求提供一个更好的例子:

公共静态对象b=null;
公共静态无效a(){
System.out.println(“OK”);
}
公共静态void main(字符串[]args){
线程=新线程(()->{
试一试{
睡眠(1000);
}捕捉(中断异常e){
e、 printStackTrace();
}
b=4;
});
thread.start();
while(true){
//系统输出打印(“”);
如果(b!=null){
a();
}
}
}

取消对该行的注释以使其正常工作(打印正常)

请显示一个我们可以运行的完整示例,该示例再现了问题。可能还有其他因素在起作用。如果a
System.out.println()
更改了某些内容,您可以提供一个吗?这可能是以下两个原因之一:1。它实际上并没有改变任何东西,但重新编译实际上使代码运行了您认为在1或2之前运行的代码。该语句中涉及的同步稍微改变了代码的计时,并围绕代码中的竞态条件工作。请参见编辑,应该更清楚地了解发生了什么是:
b
不是易变的,因此在无休止的循环中读取它永远不会看到新值。
System.out.println()
附带创建了一个读取障碍,这意味着
b
将被重新读取,并且缓存的值不会被重新使用。将
b
设置为volatile,以便在不使用
System.out.println
的情况下对其进行修复。请给出我们可以运行的完整示例,该示例再现了问题。可能还有其他因素在起作用。如果a
System.out.println()
更改了某些内容,您可以提供一个吗?这可能是以下两个原因之一:1。它实际上并没有改变任何东西,但重新编译实际上使代码运行了您认为在1或2之前运行的代码。该语句中涉及的同步稍微改变了代码的计时,并围绕代码中的竞态条件工作。请参见编辑,应该更清楚地了解发生了什么是:
b
不是易变的,因此在无休止的循环中读取它永远不会看到新值。
System.out.println()
附带创建了一个读取障碍,这意味着
b
将被重新读取,并且缓存的值不会被重新使用。使
b
易失性,在不使用
System.out.println的情况下修复它。