Kon*_*che 6 java concurrency multithreading operating-system scheduling
在《Java 并发实践》一书中,作者写道:
当锁定发生争用时,失败的线程必须阻塞。JVM 可以通过自旋等待(反复尝试获取锁直到成功)或通过操作系统挂起被阻塞的线程来实现阻塞。哪个更高效取决于上下文切换开销和锁变得可用之前的时间之间的关系;对于短时间的等待,首选旋转等待,而对于长时间的等待,首选暂停。一些 JVM根据过去等待时间的分析数据在两者之间进行自适应选择,但大多数只是挂起等待锁的线程。
当我读到这篇文章时,我感到非常惊讶。是否有任何已知的 JVM 在始终旋转等待或有时由于分析结果而导致旋转等待时实现阻塞?现在很难相信。
以下证据表明 JRockit 可以使用自旋锁 - http://forums.oracle.com/forums/thread.jspa?threadID=816625&tstart=494
如果您在此处列出的 JVM 选项中搜索“spin”,您将看到在 Hotspot JVM 中使用/支持自旋锁的证据。
如果您想要当前示例,请查看 OpenJDK Java 11 源代码树中的“src/hotspot/share/runtime/mutex.cpp”。
| 归档时间: |
|
| 查看次数: |
4889 次 |
| 最近记录: |