我有一个短暂的循环,如:
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语句,因为编译器认为没有必要再次检查?如果没有,有人可以向我解释,为什么第一种情况不起作用,但第二种情况不起作用?
答案 0 :(得分:6)
如果您在多线程环境中工作,则需要将变量(无论哪个有多个线程访问权限)标记为volatile
,否则,当前线程无法保证看到另一个变量写入的结果线程。
换句话说,一个线程写入(更改)变量a
的值,而另一个线程无法保证看到它(因为线程可能会复制/缓存变量),这会导致您的{{ 1}}循环不要破坏。
我建议您查看here并了解while
在多线程环境中的工作原理。下面的文字(强调我的)来自同一个链接:
对
volatile
变量的更改始终对其他线程可见。当一个线程读取volatile
变量时,它不仅会看到对volatile的最新更改,还会看到导致更改的代码的副作用。