Kia*_*oss 2 java multithreading if-statement while-loop
我遇到一个问题,如果在while循环中发生了其他事情,if语句才会运行.
这是我想要使用的代码:
public void load() throws IOException, InterruptedException {
while (true) {
if (findGame == true) {
System.out.println(findGame);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是简化但它显示了我的问题.基本上,何时findGame == true,if语句不运行.我不认为if语句正在运行的原因是因为该变量没有打印到控制台.
我做了一些测试,发现if语句使用以下代码运行:
public void load() throws IOException, InterruptedException {
while (true) {
System.out.println("foo"); // New code added
if (findGame == true) {
System.out.println(findGame);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么它与上面的代码一起工作但不是第一个?两者之间的唯一区别是,工作的那个有其他东西添加到while循环.
如果它有所不同,我上面显示的代码在一个单独的线程中运行.
如果它有所不同,我上面显示的代码在一个单独的线程中运行.
这就是问题所在.你依赖于一个线程设置的值在另一个线程中可见 - 并且没有这样的保证而没有涉及内存屏障.在你的第二个代码中,调用println几乎肯定负责创建读取线程"看到"写入线程写入的值所需的内存障碍.记忆模型很难,不幸的是:(
如果您使用AtomicBoolean而不仅仅是一个boolean字段,您可能会发现第一个代码正常工作 - 但即便如此,紧密循环通常也是一个坏主意.最好使用信号量或类似的信号,因此"读取"线程可以等待(空闲)直到发生变化.寻找java.util.concurrent诸如Semaphore和之类的课程CountDownLatch.(您可以使用waitand notify,但如果使用更高级别的抽象,它会更简单.)
| 归档时间: |
|
| 查看次数: |
694 次 |
| 最近记录: |