gpt4 book ai didi

java - while 循环停止检查 if 语句?

转载 作者:行者123 更新时间:2023-12-01 07:48:49 25 4
gpt4 key购买 nike

我有一个短暂的 while 循环,例如:

boolean a = false;
MyClass b = new MyClass();
b.b = false;

// b is used in other thread...

while(!a){
if(b.b){
throw new Exception("b is true");
}
}

在本例中a永远不会成为真,但经过一些运行后, boolean 变量 b.b应该成为现实。奇怪的是,while 循环从未离开过,我的程序陷入了无限循环。

我很想知道为什么,并决定添加一个 System.out.print循环语句:

while(!a){
if(b.b){
throw new Exception("b is true");
}
System.out.println("there is something more to execute");
}

值得注意的是,我的代码按照应有的方式工作。 while 循环遍历 if 语句,直到 b.b为 true 并且抛出异常会离开循环。

是否在第一种情况下,程序停止检查 if 语句,因为编译器认为不需要再次检查?如果没有,有人可以向我解释一下,为什么第一个案例不起作用,而第二个案例却起作用?

最佳答案

如果您在多线程环境中工作,则需要将变量(以能够访问多个线程的变量为准)标记为 volatile ,否则,无法保证当前线程看到结果由另一个线程编写。

换句话说,一个线程写入(更改)变量 a 的值,而另一个线程不能保证看到它(因为线程可能会复制/缓存变量),这会导致你的 while 循环不会中断。

我建议你看看here并了解 volatile 在多线程环境中如何工作。下面的文本(强调我的)取自同一链接:

Changes to a volatile variable are always visible to other threads. When a thread reads a volatile variable, it sees not just the latest change to the volatile, but also the side effects of the code that led up the change.

关于java - while 循环停止检查 if 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43352187/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com