Java:如果语句在无限循环中

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编译器的规则有关,但它对我来说非常混乱.任何澄清这一点的帮助将不胜感激.

Cam*_*ner 7

如果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在临时变量中,因为您希望同步块尽可能小 - 它们强制执行互斥锁定,因此您不希望在那里执行太多操作.

或者,你可以只声明xvolatile,这很可能将是足以满足您的使用情况.我建议你使用该synchronized版本,因为你最终需要知道如何synchronized正确使用,所以你现在也可以学习它.