【问题标题】:HotSpot JVM optimizations for nested synchronized blocksHotSpot JVM 优化嵌套同步块
【发布时间】:2014-07-22 06:33:17
【问题描述】:

HotSpot JVM(在 Oracle JDK 7 和 8 中)是否针对在同一对象上同步的嵌套 synchronized 块进行优化?

例如,第一个代码列表(A 类)是否与第二个代码列表(B 类)一样有效? (B 类避免了A 类中出现的嵌套synchronized (x)

public class A {
    private final Object x = new Object();

    public void a() {
        synchronized (x) {
            // code snippet 1
            b();
            // code snippet 2
        }
    }

    public void b() {
        synchronized (x) {
            // code snippet 3
        }
    }
}

public class B {
    private final Object x = new Object();

    public void a() {
        synchronized (x) {
            // code snippet 1
            c();
            // code snippet 2
        }
    }

    public void b() {
        synchronized (x) {
            c();
        }
    }

    private void c() {
        // code snippet 3
    }
}

【问题讨论】:

标签: java optimization synchronization synchronized jvm-hotspot


【解决方案1】:

是的,JDK 7 中甚至还有一个 VM 选项(默认开启):

-XX:+EliminateNestedLocks

但是,它似乎仅在监视对象为static final 或锁定this 对象时才有效。

【讨论】:

    【解决方案2】:

    如果b 足够短可以内联,我希望如此。否则不行,因为过程间分析太复杂并且增益有限(不能内联的可能需要很长时间,以至于一些开销是可以接受的)。但是你仍然可以从偏向锁定中获利。

    这只是一个猜测,但即使是 JDK6 也有 lock coarsening,这可以被认为是您所询问的更复杂的版本。内联后我们有

    public void a() {
        synchronized (x) {
            // code snippet 1
            synchronized (x) {
                // code snippet 3
            }
            // code snippet 2
        }
    }
    

    虽然锁粗化从类似的东西开始

    public void a() {
        synchronized (x) {
            // code snippet 1
        }
        synchronized (x) {
            // code snippet 3
        }
        synchronized (x) {
            // code snippet 2
        }
    }
    

    这是一个更复杂的情况,因为在这里加入同步块会降低吞吐量,而在您的情况下,绝对不会有任何损失。

    【讨论】:

    • 你有锁粗化到前面。您在此处显示的转换无效。否则你没有说清楚。
    • @EJP “粗化到前面。” ?你失去了我。我的第二个例子是锁粗化。第一个只是删除已经持有的锁的获取和释放。
    猜你喜欢
    • 2012-05-09
    • 1970-01-01
    • 2020-07-15
    • 2013-02-13
    • 2016-06-01
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多