while循环停止检查if语句?

时间:2017-04-11 17:05:53

标签: java multithreading if-statement while-loop infinite-loop

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

re.match

在这种情况下,.group(1)永远不会成为现实,但在一些运行之后,布尔变量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"); } } 应该成立。奇怪的是,while循环从未离开,我的程序在无限循环中发挥作用。

我想知道为什么并决定在循环中添加a语句:

b.b

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

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

1 个答案:

答案 0 :(得分:6)

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

换句话说,一个线程写入(更改)变量a的值,而另一个线程无法保证看到它(因为线程可能会复制/缓存变量),这会导致您的{{ 1}}循环不要破坏。

我建议您查看here并了解while在多线程环境中的工作原理。下面的文字(强调我的)来自同一个链接:

  

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

相关问题