gpt4 book ai didi

java - 线程在某些情况下处于忙等待状态,而在其他情况下则不会

转载 作者:行者123 更新时间:2023-11-29 04:37:11 24 4
gpt4 key购买 nike

我遇到了一个关于 java 线程忙等待的非常奇怪的问题。

我有一个线程忙于等待其他线程的静态变量的状态。假设繁忙等待的线程正在等待另一个线程的静态 int 变量达到某个值

while(OtherThread.countInt < 5);

如果我使用上面的代码,即使 static int countInt 确实达到 5,线程也会卡在忙等待状态并且不会跳出 while 循环。

while(OtherThread.countInt < 5) {
// waste some time doing meaningless work
}

但是,如果我使用其他代码,则线程确实跳出忙等待循环。有时,当 countInt 达到 5 时,其他时候会稍晚。但它发生了。对于我的特定示例,我将其用作“无意义的工作”

print("busy waiting...",1000)//浪费时间做无意义的工作

我将 print 定义为 synchronzied static void print(String s, int n) 打印字符串 s 然后 hibernate n 毫秒。

什么给了?为什么线程忙于等待第一个代码,而不是另一个代码?所有线程都具有相同的优先级,因此这不是优先级问题。

最佳答案

countInt 不是volatile,因此不能保证更改对等待线程可见。

由于您的 print() 方法是同步的,它可能会创建足够的内存屏障,使更新后的值对您的 while 循环可见。这本质上是巧合; while 条件本身仍然是错误的。这就是为什么正确设计和测试并发代码如此重要的原因 - 很容易编写一些只看起来按预期工作但稍后会失败的东西(例如,在负载下,在不同的处理器上,在看似-安全重构等)。

使用适当的内存屏障,例如synchronised 读取和写入、volatile 字段或跨线程通信机制(如java.util.concurrent 中的机制) .有许多 related questions探索 volatile 和这些其他工具。

你也好好学习Java's concurrency support .跨线程通信非常重要。

关于java - 线程在某些情况下处于忙等待状态,而在其他情况下则不会,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40835156/

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