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)
您遇到同步问题,导致可见性问题.如果在读取和写入由多个线程共享的变量时未使用同步,则无法保证一个线程写入的值对其他线程可见.
要解决这个问题,你需要做以下事情之一:
state场volatilestate字段类型更改为AtomicIntegerstate字段(使用synchronized关键字).您的sysout调用使值可见,因为它在内部调用一些方法将寄存器的状态刷新到主存储器(例如,通过写入volatile字段或调用synchronized方法).