在Java Concurrency in Practice中,作者写道:
当争用锁定时,丢失的线程必须阻塞。 JVM可以通过旋转等待(反复尝试获取锁定直到成功)或通过暂停阻止线程来实现阻止 操作系统。哪个效率更高取决于上下文切换开销与锁定可用之前的时间之间的关系;短暂等待优选旋转等待,并且对于长时间等待是优选的。 有些JVM根据过去等待时间的分析数据自适应选择,但大多数只是挂起等待锁定的线程。
当我读到这篇文章时,我感到非常惊讶。是否有任何已知的JVM通过自旋等待或有时由于分析结果而实现阻塞?现在很难相信。
答案 0 :(得分:4)
以下证据表明JRockit可以使用自旋锁 - http://forums.oracle.com/forums/thread.jspa?threadID=816625&tstart=494
如果您在列出的here列出的JVM选项中搜索“spin”,您将看到在Hotspot JVM中使用/支持自旋锁的证据。
答案 1 :(得分:2)
作者所写的是正确的,它只是有意义的。 Linux也是如此。使用自旋锁的原因是因为大多数资源都保护了几分之一毫秒。因此,要暂停,将寄存器的所有内容推送到堆栈并放弃CPU只是过多的开销并且不值得。因此即使它只是在一组紧凑的指令中旋转,有时只是浪费时间,它仍然比交换更有效。
话虽如此,通过VM分析,理想情况下可以提高处理效率。因此,是否有特殊情况需要暂停?或者也许总是旋转等待?