Iva*_*van 4 java infinite-loop conditional-statements
我是Java的新手,以下可能是显而易见的,但对我来说这很令人费解.请考虑以下代码:
while(1>0){
if(x!=0){
//do something
}
}
Run Code Online (Sandbox Code Playgroud)
x变量在不同的线程中更改.但是,即使x不为零,也不会执行if语句中的代码.如果我通过以下更改代码
while(1>0){
System.out.println("here");
if(x!=0){
//do something
}
}
Run Code Online (Sandbox Code Playgroud)
当x不再为零时,现在执行if语句中的代码.我怀疑这与Java编译器的规则有关,但它对我来说非常混乱.任何澄清这一点的帮助将不胜感激.
如果x在不同的线程中进行更改,那么您可能会看到一个副作用,即您没有同步访问该变量.
Java内存和线程模型非常复杂,因此我建议您获取Brain Goetz 的Java Concurrency in Practice的副本并阅读.
简短的回答是确保访问x包含在一个synchronized块中:
while (1 > 0) {
int temp;
synchronized (this) {
temp = x;
}
if (temp != 0) {
// Do something
}
}
Run Code Online (Sandbox Code Playgroud)
同样在修改的代码中x.
请注意,此示例存储x在临时变量中,因为您希望同步块尽可能小 - 它们强制执行互斥锁定,因此您不希望在那里执行太多操作.
或者,你可以只声明x是volatile,这很可能将是足以满足您的使用情况.我建议你使用该synchronized版本,因为你最终需要知道如何synchronized正确使用,所以你现在也可以学习它.