在java中有偏见的锁定

Cha*_*ani 29 java concurrency jvm locking biased-locking

我继续阅读有关如何使用标志-XX:+ UseBiasedLocking进行偏置锁定可以提高无竞争同步的性能.我无法找到它的作用以及它如何改善性能.

任何人都可以解释我究竟是什么,或者可能指向我解释一些链接/资源?

Cle*_*t P 37

实质上,如果您的对象仅由一个线程锁定,则VM可以进行优化并将该对象"偏向"该线程,使得对该对象的后续原子操作不会产生同步成本.我想这通常是针对过于保守的代码,它们对对象执行锁定而不会将它们暴露给另一个线程.实际的同步开销只会在另一个线程尝试获取对象的锁定时启动.

它默认在Java 6中启用.

-XX:+ UseBiasedLocking启用一种技术来提高无竞争同步的性能.对象被"偏向"线程,该线程首先通过monitorenter字节码或同步方法调用获取其监视器; 在多处理器计算机上,该线程执行的后续监视器相关操作相对快得多.一些具有大量无竞争同步的应用程序可以在启用此标志的情况下获得显着的加速; 某些具有某些锁定模式的应用程序可能会出现减速,但已尝试尽量减少负面影响.

  • 不幸的是,openJDK 15 正在贬值偏置锁定,请参阅 https://openjdk.java.net/jeps/374#:~:text=Biased%20locking%20is%20an%20optimization,the%20overhead%20of%20uncontished%20locking.&text =%20的%20初始%20锁定%20,在%20的%20相同的%20对象上操作%20。和 https://quarkus.io/blog/biased-locking-help/ (2认同)

Dan*_*mas 5

这不能回答你的问题吗?

http://www.oracle.com/technetwork/java/tuning-139912.html#section4.2.5

启用一种技术来提高无竞争同步的性能.对象被"偏向"线程,该线程首先通过monitorenter字节码或同步方法调用获取其监视器; 在多处理器计算机上,该线程执行的后续监视器相关操作相对快得多.一些具有大量无竞争同步的应用程序可以在启用此标志的情况下获得显着的加速; 某些具有某些锁定模式的应用程序可能会出现减速,但已尝试尽量减少负面影响.

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

http://www.jroller.com/ethdsy/entry/print_all_jvm_flags


小智 5

我自己一直想知道偏向锁。

然而,似乎java的偏向锁在intel的nehalem处理器上比普通锁慢,并且大概在nehalem以来的两代处理器上。请参阅http://mechanical-sympathy.blogspot.com/2011/11/java-lock-implementations.html 和此处http://www.azulsystems.com/blog/cliff/2011-11-16-a-short-偏向锁定会话

更多信息请参见https://blogs.oracle.com/dave/entry/biased_locking_in_hotspot

我一直希望有一些相对便宜的方法来撤销对英特尔的偏见锁定,但我开始相信这是不可能的。我看过的有关如何完成此操作的文章依赖于以下任一方法:

  1. 使用操作系统来停止线程
  2. 发送信号,即在另一个线程中运行代码
  3. 拥有保证在另一个线程中经常运行的安全点并等待一个线程被执行(这就是java所做的)。
  4. 具有类似的安全点,即调用返回 - 另一个线程将代码修改为断点...