Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否有JVM使用自旋等待实现阻塞?_Java_Multithreading_Concurrency_Operating System_Scheduling - Fatal编程技术网

Java 是否有JVM使用自旋等待实现阻塞?

Java 是否有JVM使用自旋等待实现阻塞?,java,multithreading,concurrency,operating-system,scheduling,Java,Multithreading,Concurrency,Operating System,Scheduling,在Java并发实践中,作者写道: 当锁定被争用时,丢失的线程必须阻塞。JVM可以通过自旋等待(反复尝试获取锁,直到成功)或通过操作系统挂起被阻止的线程来实现阻止。哪个更有效取决于上下文切换开销与锁可用时间之间的关系;短等待时首选旋转等待,长等待时首选暂停一些JVM根据过去等待时间的分析数据自适应地在两者之间选择,但大多数JVM只是挂起等待锁定的线程 当我读到这篇文章时,我非常惊讶。是否有已知的JVM在总是旋转等待或有时由于分析结果而旋转等待上实现阻塞?现在很难相信。有证据表明JRockit可以使

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

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


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

有证据表明JRockit可以使用自旋锁-


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

作者所写的是正确的,而且只有意义。Linux也是如此。之所以使用自旋锁,是因为大多数资源的保护时间只有几分之一毫秒。因此,挂起、将寄存器的所有内容推送到堆栈上并放弃CPU的开销太大,不值得这么做。因此,即使它只是在一组紧凑的指令中旋转,有时只是浪费时间,但它仍然比调出指令更有效


这就是说,使用虚拟机评测,理想情况下会使您的处理更加高效。因此,是否存在您始终希望暂停的特定情况?或者可能总是旋转等待?

我不知道如何在JVM中具体使用,但Windows在多核系统上为
关键部分
对象实现自适应旋转锁。是的,据我所知,所有这些对象都使用普通的synchronized关键字来修改等待器。有一些impl可以旋转几秒钟(如果你有足够的内核,这没关系),JVM选项列表已经移动:我不熟悉Java,但出于好奇,程序员是否可以强制暂停或强制旋转等待,而不是允许JVM自适应地选择?