2017-04-11 188 views
0

我有一个简短的while循环一样:while循环停止检查if语句?

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永远不会成真,但一些运行后布尔变量b.b应该成真。奇怪的是,while循环从未离开过,我的程序无限循环。

我woundered为什么决定到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为真,并抛出异常将退出循环。

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

+0

如何在线程之间同步b.b? – bowmore

+1

如果b.b在你的if里面是真的,为什么不使用break或set a为真?针对预期的行为抛出异常并不是很好的设计。 –

+1

也许向我们展示b如何在另一个线程中使用 –

回答

6

如果您正在使用多线程环境,则需要将您的变量(无论哪个人都可以访问多个线程)标记为volatile,否则,不能保证当前线程能够看到其他线程写入的结果。

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

我建议你看看here并了解volatile如何在多线程环境中工作。下面的文本(重点煤矿)从相同的链接采取:

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

+0

感谢您的回答。我不知道这种行为。也描述在http://stackoverflow.com/questions/25425130/loop-doesnt-see-changed-value-without-a-print-statement – team17

+0

没问题,'volatile'是一个基本的概念,但一个重要的 – developer