2012-02-24 29 views
19

我一直在阅读关于使用标志-XX:+ UseBiasedLocking如何偏置锁定可以提高无争用同步的性能。我无法找到它的作用,以及它如何提高性能。在java中偏向锁定

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

回答

26

本质上,如果你的对象是由一个线程仅锁定,VM可以做出优化和“偏向“该对象到该线程,以致对该对象的后续原子操作不引起同步成本。我想这通常是针对过分保守的代码,它会在对象上执行锁定,而不会将它们暴露给另一个线程。一旦另一个线程尝试获取对象的锁定,实际的同步开销将只能进行。

它是在默认情况下,爪哇6.

-XX:+ UseBiasedLocking 启用用于改善非争用同步的性能的技术。一个对象“偏向”首先通过monitorenter字节码或同步方法调用获取其监视器的线程;在多处理器机器上,由该线程执行的后续与监视器相关的操作相对快得多。具有大量无争用同步的某些应用程序可以在启用此标志的情况下实现显着的加速;某些具有某种锁定模式的应用程序可能会看到速度减慢,尽管已尝试尽量减少负面影响。

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

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)具有类似的安全点,这是一个返回的调用 - 另一个线程将代码修改为断点...