IF语句只有在它正在测试的值的'sysout'之前才会执行

DSF*_*DSF 1 java multithreading if-statement

我收到一个非常奇怪的错误.我有以下代码:

while (true) {
    System.out.println(model.getLightState());
    if (model.getLightState() == 1) {
        System.out.println("Entered..");
        view.driveThroughJunction();
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,当灯光状态变为"1"时,我的程序进入if语句并执行正常的代码.但是,只有在输入while循环后我有打印输出语句时,这才有效.我觉得很奇怪.'sysout'行会对if语句产生什么影响吗?显然它适用于上述情况.

对此为何的任何想法?

编辑:

(in the model class)
public final byte getLightState() {
    return lightChanger.getLightValue();
}

(in lightchanger class)
public byte getLightValue() {
    return light.getState();
}

(in the light class)
public final byte getState() {
    return this.state;
}
Run Code Online (Sandbox Code Playgroud)

JB *_*zet 5

您遇到同步问题,导致可见性问题.如果在读取和写入由多个线程共享的变量时未使用同步,则无法保证一个线程写入的值对其他线程可见.

要解决这个问题,你需要做以下事情之一:

  • statevolatile
  • state字段类型更改为AtomicInteger
  • 当然,每次使用相同的锁同步每次访问state字段(使用synchronized关键字).

您的sysout调用使值可见,因为它在内部调用一些方法将寄存器的状态刷新到主存储器(例如,通过写入volatile字段或调用synchronized方法).