gpt4 book ai didi

java - 为什么这个 'if' 语句不会在 while 循环中运行,而 while 循环中也不会发生其他事情?

转载 作者:行者123 更新时间:2023-12-02 20:17:11 24 4
gpt4 key购买 nike

我遇到一个问题,即 if 语句仅在 while 循环中之前发生其他事情时才运行。

这是我要使用的代码:

public void load() throws IOException, InterruptedException {
while (true) {
if (findGame == true) {
System.out.println(findGame);
}
}
}

这很简化,但它显示了我的问题。基本上,当 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);
}
}
}

我的问题是为什么它适用于上面的代码而不适用于第一个代码?两者之间的唯一区别是,有效的一个在 while 循环中添加了其他内容。

如果有什么不同,我上面显示的代码是在单独的线程中运行的。

最佳答案

If it makes a difference, the code I've shown above is running in a separate thread.

这就是问题所在。您依赖一个线程设置的值在另一个线程中可见 - 如果不涉及内存屏障,就没有这样的保证。在您的第二个代码中,对 println 的调用几乎肯定负责创建读取线程“查看”写入线程写入的值所需的内存屏障。不幸的是,内存模型很难:(

如果您使用AtomicBoolean您可能会发现第一个代码可以工作,而不仅仅是一个 boolean 值字段 - 但即便如此,紧密循环通常不是一个好主意。最好使用信号量或某种类似的信号,这样“读取”线程就可以(空闲地)等待,直到发生变化。查看 java.util.concurrent 中的类,如 SemaphoreCountDownLatch 。 (您可以仅使用 waitnotify 来完成此操作,但如果您使用更高级别的抽象,它会更简单。)

关于java - 为什么这个 'if' 语句不会在 while 循环中运行,而 while 循环中也不会发生其他事情?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31356162/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com