38

我一直在阅读有关使用 flag 的偏向锁定如何-XX:+UseBiasedLocking提高非竞争同步的性能的信息。我找不到关于它的作用以及它如何提高性能的参考。

谁能解释一下它到底是什么,或者可能指向我一些解释的链接/资源?

4

5 回答 5

47

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

它在 Java 6 中默认开启。

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

于 2012-02-25T00:03:55.000 回答
6

这不能回答你的问题吗?

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

于 2012-02-25T00:00:40.447 回答
4

我自己一直想知道有偏见的锁。

然而,在英特尔的 nehalem 处理器上,java 的偏向锁似乎比普通锁要慢,并且可能在自 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. 具有类似的安全点是对返回的调用-另一个线程将代码修改为断点...
于 2014-10-09T23:10:22.053 回答
1

值得一提的是,从 jdk15 开始默认禁用偏向锁定

JEP 374:禁用和弃用偏向锁定

过去看到的性能提升在今天远不那么明显。许多受益于偏向锁定的应用程序是使用早期 Java 集合 API 的较旧的遗留应用程序,这些 API 在每次访问时都会同步(例如,Hashtable 和 Vector)。较新的应用程序通常使用 Java 1.2 中针对单线程场景引入的非同步集合(例如 HashMap 和 ArrayList),或者使用 Java 5 中针对多线程场景引入的性能更高的并发数据结构。

更远

偏向锁定在同步子系统中引入了许多复杂的代码,并且还侵入了其他 HotSpot 组件。这种复杂性是理解代码各个部分的障碍,也是在同步子系统内进行重大设计更改的障碍。为此,我们希望禁用、弃用并最终移除对偏向锁定的支持。

是的,没有更多的System.identityHashCode(o)魔法;)

于 2021-07-16T01:31:13.323 回答