【发布时间】:2011-09-13 15:01:50
【问题描述】:
在 Java 并发实践中,作者写道:
当锁被争用时,失败的线程必须阻塞。 JVM 可以通过spin-waiting(反复尝试获取锁直到成功)或通过挂起被阻塞的线程来实现阻塞要么操作系统。哪个更高效取决于上下文切换开销和锁可用时间之间的关系; spin-waiting 是短等待的首选,而暂停是长等待的首选。 一些 JVM 会根据过去等待时间的分析数据自适应地在两者之间进行选择,但大多数只是挂起等待锁定的线程。
当我读到这篇文章时,我感到非常惊讶。由于分析结果,是否有任何已知的 JVM 在始终旋转等待或有时旋转等待时实现阻塞?现在很难相信。
【问题讨论】:
-
我不知道具体在 JVM 中的使用,但是 Windows 在多核系统上为
CRITICAL_SECTION对象实现了自适应自旋锁。 -
是的,据我所知,所有这些,正常的同步关键字使用自旋锁来修改服务员。有些 impl 可以旋转几秒钟(只要你有足够的核心,没关系)
标签: java multithreading concurrency operating-system scheduling