gpt4 book ai didi

java - 为什么更喜欢 wait/notify 而不是 while 循环?

转载 作者:行者123 更新时间:2023-12-01 18:06:05 25 4
gpt4 key购买 nike

我对等待/通知的优点有一些误解。据我了解,处理器核心在这两种情况下都没有任何帮助,那么编写复杂的等待/通知 block 代码而不是仅仅在循环中等待的原因是什么? 我很清楚,当两个线程仅在一个内核上执行时,等待/通知不会窃取处理器时间。

最佳答案

“循环等待”通常称为“忙循环”或“忙等待”:

 while ( ! condition()) {
// do nothing
}
workThatDependsOnConditionBeingTrue();

这是对可能需要 CPU 时间的其他线程或进程的不尊重(如果可以的话,它会占用该核心 100% 的时间)。所以还有另一种变体:

 while ( ! condition()) {
sleepForShortInterval();
// do nothing
}
workThatDependsOnConditionBeingTrue();

此变体中的小 sleep 将显着降低 CPU 使用率,即使它长约 100 毫秒,除非您的应用程序是实时的,否则这应该不会被注意到。

请注意,条件实际变为 true 与 sleepForShortInterval() 结束之间通常会存在延迟。如果为了对别人更有礼貌,你睡得更久——延迟就会增加。这在实时场景中通常是 Not Acceptable 。

执行此操作的好方法是,假设正在检查的任何 condition() 正在从另一个线程更改,则让另一个线程在完成您正在等待的任何操作时唤醒您。代码更干净,没有 CPU 浪费,也没有延迟。

当然,实现繁忙等待会更快,并且对于快速而肮脏的情况可能是合理的。

请注意,在多线程场景中,condition() 可以更改为 false 和 true,您需要在 whileworkThatDependsOnConditionBeingTrue() 以避免其他线程在这个精确的时间点更改其值(这称为竞争条件,事后很难调试)。

关于java - 为什么更喜欢 wait/notify 而不是 while 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36310700/

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