【发布时间】:2025-12-18 18:40:02
【问题描述】:
好吧,标题基本上说明了一切,还有一点我真的很想知道何时使用它们。它可能很简单 - 我已经阅读了他们两个的文档,但仍然无法分辨出太多区别。
这里有像this 这样的答案,基本上是说:
让步对于忙碌的等待也很有用...
我不太同意他们的观点,原因很简单,ForkJoinPool 在内部使用Thread::yield,这是 jdk 世界中最近添加的。
真正困扰我的是 jdk 中的类似用法(StampledLock::tryDecReaderOverflow):
else if ((LockSupport.nextSecondarySeed() & OVERFLOW_YIELD_RATE) == 0)
Thread.yield();
else
Thread.onSpinWait();
return 0L;
因此,似乎在某些情况下,一个人会比另一个人更受欢迎。不,我没有一个我可能需要这个的实际示例 - 我实际使用的唯一一个是 Thread::onSpinWait 因为 1)我碰巧忙着等待 2)这个名字几乎是不言自明的,我应该 在忙碌的旋转中使用过它。
【问题讨论】:
-
您能描述一个需要旋转等待的场景吗?作为 Java 用户而非实现者,我从来不需要这样做。当然,在内核编程中,自旋锁无处不在。但是在 Java 中呢?我想不出我会旋转等待而不是使用锁、监视器或异步回调的用例。 (我并没有刻薄。如果答案几乎没有人应该使用它们中的任何一个,那么询问使用哪一个可能是错误的问题。)
-
@JohnKugelman 我从来没有需要 - 我只知道该方法存在并且它的文档有一个与我所拥有的非常匹配的示例,因此决定使用它, 希望它能以某种方式提高性能。我也从来不需要忙着旋转——感觉就像我绝对应该尝试的。
-
@Torben 考虑到我在该问题中给出了其中一个答案,我不认为这是重复的。
-
API 示例显示了一个在 volatile 标志上旋转的循环。如果您正在实现低级锁定原语,那很好。奇怪的是,大多数阅读它的人都不是。他们应该远离这样的成语。旋转变量仅供专家和初学者使用。
标签: java concurrency java.util.concurrent