java中的有偏锁定

java中的有偏锁定,java,concurrency,jvm,locking,biased-locking,Java,Concurrency,Jvm,Locking,Biased Locking,我一直在读关于使用标志-XX:+UseBiasedLocking的偏置锁定如何提高未竞争同步的性能。我找不到关于它的作用以及它如何提高性能的参考 有人能给我解释一下它到底是什么或可能是什么吗?请给我指一些链接/资源来解释它。这难道不能回答您的问题吗 启用一种技术,以提高非竞争对手的性能 同步。一个对象“偏向”第一个线程 通过监视器输入字节码或同步获取其监视器 方法调用;由执行的后续监控相关操作 在多处理器机器上,该线程相对更快。 某些应用程序具有大量的非竞争性 使用此标志进行同步可能会获得显著

我一直在读关于使用标志
-XX:+UseBiasedLocking
的偏置锁定如何提高未竞争同步的性能。我找不到关于它的作用以及它如何提高性能的参考


有人能给我解释一下它到底是什么或可能是什么吗?请给我指一些链接/资源来解释它。

这难道不能回答您的问题吗

启用一种技术,以提高非竞争对手的性能 同步。一个对象“偏向”第一个线程 通过监视器输入字节码或同步获取其监视器 方法调用;由执行的后续监控相关操作 在多处理器机器上,该线程相对更快。 某些应用程序具有大量的非竞争性 使用此标志进行同步可能会获得显著的加速 启用;某些具有特定锁定模式的应用程序可能会看到 减速,尽管已尝试将负面影响降至最低 影响

虽然我想你会发现它在1.6中默认打开。使用PrintFlagsFinal诊断选项查看有效标志是什么。如果要调查服务器应用程序,请确保指定-server,因为标志可能不同:


本质上,如果您的对象只被一个线程锁定,JVM可以对该对象进行优化并将其“偏向”到该线程,从而使对象上的后续原子操作不会产生同步成本。我想这通常是针对过于保守的代码,这些代码在对象上执行锁,而不会将它们暴露给另一个线程。只有当另一个线程试图获得对象上的锁时,实际的同步开销才会生效

在Java6中,默认情况下它处于启用状态

-XX:+UseBiasedLocking 启用一种技术以提高无争用同步的性能。对象“偏向”于首先通过monitorenter字节码或同步方法调用获取其监视器的线程;在多处理器机器上,该线程执行的后续监视器相关操作相对要快得多。一些具有大量非竞争性同步的应用程序在启用此标志时可能会获得显著的加速;一些具有特定锁定模式的应用程序可能会出现速度减慢,尽管已经尝试将负面影响降至最低


我自己也一直在想有偏见的锁

然而,在英特尔的nehalem处理器上,java的偏向锁似乎比普通锁慢,而且可能是在nehalem之后的两代处理器上。看见 这里呢

这里还有更多信息

我一直希望有一些相对便宜的方法来撤销对英特尔的偏见,但我开始相信这是不可能的。我所看到的关于它是如何实现的文章依赖于:

  • 使用操作系统停止线程
  • 发送信号(在另一个线程中运行代码)
  • 具有保证在另一个线程中相当频繁地运行的安全点,并等待一个线程执行(java就是这样做的)
  • 具有类似的安全点,即对返回的调用-另一个线程将代码修改为断点
  • 这里有两篇论文:

    网页:

    jvm热点源代码:


    还有一篇文章给出了更精确的结果:。它是在你真正自由的几天后出版的。很遗憾,openJDK 15正在贬值。和