java - IF 语句只有在它前面有一个它正在测试的值的 'sysout' 时才会执行

标签 java multithreading if-statement

<分区>

我遇到了一个非常奇怪的错误。我有以下代码:

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

现在,当灯光状态变为“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;
}

最佳答案

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

要解决这个问题,您需要执行以下操作之一:

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

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

关于java - IF 语句只有在它前面有一个它正在测试的值的 'sysout' 时才会执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13553280/

相关文章:

java - JetS3t 填满了 my/tmp 目录。我该如何删除旧文件?

java - Android 文件为空且不为空

c# - 公开可见的锁对象: Sometimes useful or indication for design flaw?

python - (Python)试图让 "if not in"工作,它正在搜索一个 frozenset

java - 如何通过gridView.setOnItemClickListener()中的intent()传递ArrayList数据

java - 信号量 : Critical Section with priorities

c# - 在具有 ui/非 ui 线程差异的 WPF 中使用 PInvoke

.net - 如何调试 .NET 远程调用?

javascript - jQuery if/else if 语句优先级

php - IF 规则 $_POST PHP - MYSQL