while循环停止检查if语句?

tea*_*m17 0 java multithreading if-statement infinite-loop while-loop

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

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");
   }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,a永远不会成为现实,但在一些运行之后,布尔变量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");
}
Run Code Online (Sandbox Code Playgroud)

值得注意的是我的代码应该是这样的.while循环遍历if语句,直到b.b为true,并抛出异常离开循环.

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

dev*_*per 6

您需要标记变量(无论哪个有多个线程的访问权限),就volatile好像您在多线程环境中工作一样,否则,当前线程无法保证看到另一个线程写入的结果.

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

我建议你看看这里并了解volatile在多线程环境中如何工作.以下文字(强调我的)取自同一链接:

volatile变量的更改始终对其他线程可见.当线程读取volatile变量时,它不仅会看到对volatile的最新更改,还会看到导致更改的代码的副作用.