繁体   English   中英

是否有任何 JVM 使用旋转等待实现阻塞?

[英]Does any JVM implement blocking with spin-waiting?

在 Java 并发实践中,作者写道:

当锁定被争用时,丢失的线程必须阻塞。 JVM可以通过自旋等待(反复尝试获取锁直到成功)或通过操作系统挂起被阻塞的线程来实现阻塞。 哪个更有效取决于上下文切换开销与锁可用的时间之间的关系; spin-waiting 是短等待的首选,而暂停是长等待的首选。 一些 JVM 根据过去等待时间的分析数据自适应地在两者之间进行选择,但大多数只是挂起等待锁定的线程。

当我读到这篇文章时,我感到非常惊讶。 由于分析结果,是否有任何已知的 JVM 在始终旋转等待或有时旋转等待时实现阻塞? 现在很难相信。

这是 JRockit 可以使用自旋锁的证据 -http://forums.oracle.com/forums/thread.jspa?threadID=816625&tstart=494

如果您在此处列出的 JVM 选项中搜索“自旋”,您将看到在热点 JVM 中使用/支持自旋锁的证据。

作者所写的是正确的,它才有意义。 Linux 也是如此。 使用自旋锁的基本原理是因为大多数资源的保护时间只有几分之一毫秒。 因此,要挂起,将寄存器的所有内容压入堆栈并放弃 CPU,开销太大,不值得。 因此,即使它只是在一组紧凑的指令中旋转,有时只是浪费时间,它仍然比换出更有效。

话虽如此,通过 VM 分析,理想情况下它会使您的处理更加高效。 因此,是否存在您总是想暂停的特殊情况? 或者也许总是旋转等待?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM