是否有任何JVM通过自旋等待实现阻塞?

问题描述

| 在《 Java Concurrency in Practice》中,作者写道:   当争用锁定时,丢失的线程必须阻塞。 JVM可以通过旋转等待(反复尝试获取锁直到成功)来实现阻塞,也可以通过操作系统挂起阻塞的线程来实现阻塞。哪种效率更高取决于上下文切换开销与锁定可用时间之间的关系。对于短暂的等待,最好使用自旋等待;对于长时间的等待,最好使用悬浮。一些JVM基于对过去等待时间的分析数据在两个自适应之间进行选择,但大多数JVM只是挂起线程等待锁定。 当我读到这篇文章时,我很惊讶。是否有任何已知的JVM由于分析结果而总是在自旋等待或有时自旋等待中实现阻塞?现在很难相信。     

解决方法

        这是JRockit可以使用自旋锁的证据-http://forums.oracle.com/forums/thread.jspa?threadID=816625&tstart=494 而且,如果您在此处列出的JVM选项中搜索\“ spin \”,您将看到在Hotspot JVM中使用/支持自旋锁的证据。     ,        作者写的东西是对的,而且只有道理。 Linux也是如此。之所以使用自旋锁,是因为大多数资源在不到一毫秒的时间内受到保护。因此,要挂起,将寄存器的所有内容压入堆栈并放弃CPU只是过多的开销,不值得。因此,即使它只是产生严格的指令集,有时只是浪费时间,它仍然比换出指令更有效。 话虽这么说,通过VM分析,理想情况下将使您的处理效率更高。因此,在某些情况下您总是想暂停吗?还是总是旋转等待?     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...