我一直在阅读有关如何使用标记-XX:+UseBiasedLocking
进行偏移锁定可以提高无争用同步的性能。我找不到它的作用以及它如何改善性能的参考。
任何人都可以解释一下它究竟是什么或者可能指向一些解释的链接/资源吗?
答案 0 :(得分:35)
基本上,如果您的对象仅由一个线程锁定,则JVM可以进行优化并将该对象“偏向”该对象,使得对象上的后续原子操作不会产生同步成本。我想这通常是针对过于保守的代码,它们对对象执行锁定而不会将它们暴露给另一个线程。实际的同步开销只会在另一个线程尝试获取对象的锁定时启动。
默认情况下,它在Java 6中打开。
-XX:+ UseBiasedLocking 启用一种技术来提高无竞争同步的性能。对象被“偏向”线程,该线程首先通过monitorenter字节码或同步方法调用获取其监视器;在多处理器计算机上,该线程执行的后续监视器相关操作相对快得多。一些具有大量无竞争同步的应用程序可以在启用此标志的情况下获得显着的加速;某些具有某些锁定模式的应用程序可能会出现减速,但已尝试尽量减少负面影响。
答案 1 :(得分:5)
这不能回答你的问题吗?
http://www.oracle.com/technetwork/java/tuning-139912.html#section4.2.5
启用一种提高无竞争性能的技术 同步。对象首先朝向线程“偏向” 通过monitorenter字节码或同步获取其监视器 方法调用;随后执行的与监视器相关的操作 该线程在多处理器机器上相对快得多。 一些应用程序具有大量的无竞争性 同步可以通过此标志获得显着的加速 启用;一些具有某些锁定模式的应用程序可能会看到 尽管已经尝试尽量减少负面影响 影响。
虽然我认为默认情况下你会发现它在1.6中。使用PrintFlagsFinal诊断选项查看有效标志是什么。如果您正在调查服务器应用程序,请确保指定-server,因为标志可能不同:
答案 2 :(得分:3)
我一直在想自己的偏见锁。
然而,似乎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-conversation-on-biased-locking
此处还有更多信息https://blogs.oracle.com/dave/entry/biased_locking_in_hotspot
我一直希望有一些相对便宜的方法来撤销对英特尔的偏见锁定,但我开始相信这是不可能的。我看过它们如何完成的文章依赖于: 1)使用os来停止线程 2)发送信号,即在另一个线程中运行代码 3)具有安全点,保证在另一个线程中经常运行并等待一个执行(这是java所做的)。 4)具有类似的安全点,即对返回的调用 - 而另一个线程将代码修改为断点...
答案 3 :(得分:0)
两张纸在这里
https://www.oracle.com/technetwork/java/biasedlocking-oopsla2006-wp-149958.pdf
网页: https://blogs.oracle.com/dave/biased-locking-in-hotspot
jvm热点源代码:
http://hg.openjdk.java.net/jdk8/jdk8/hotspot/file/87ee5ee27509/src/share/vm/oops/markOop.hpp
答案 4 :(得分:0)
值得一提的是,jdk15 以后默认会禁用偏向锁
JEP 374 : Disable and Deprecate Biased Locking
<块引用>过去看到的性能提升今天远没有那么明显。许多从偏向锁定中受益的应用程序都是使用早期 Java 集合 API 的较旧的遗留应用程序,这些 API 在每次访问时进行同步(例如,Hashtable 和 Vector)。较新的应用程序通常使用 Java 1.2 中针对单线程场景引入的非同步集合(例如,HashMap 和 ArrayList),或者使用 Java 5 中引入的性能更高的并发数据结构,用于多线程场景。>
进一步
<块引用>偏向锁定在同步子系统中引入了大量复杂的代码,并且对其他 HotSpot 组件也具有侵入性。这种复杂性是理解代码各个部分的障碍,也是在同步子系统内进行重大设计更改的障碍。为此,我们希望禁用、弃用并最终移除对偏向锁定的支持。
你,没有更多的System.identityHashCode(o)
魔法;)