首页 > 解决方案 > 嵌套同步方法的开销

问题描述

考虑以下 2 个示例:

示例 1:

Class A {
    private final B b = new B();
    public synchronized void m1() {
        b.m2();
    }
}
Class B {
    public void m2() {
        // do something
    }
}

示例 2:

Class A {
    B b = new B();
    public synchronized void m1() {
        b.m2();
    }
}
Class B {
    public synchronized void m2() {
        // do something
    }
}

假设 B.m2()在 A.m1() 中被调用,如果 B.m2() 已经被 A.m1() 保护,那么同步 B.m2() 的成本是多少?即,与示例 1 相比,示例 2 是否增加了任何开销?JVM 是否优化了示例 2 以使其看起来像示例 1?

标签: javamultithreadingsynchronizationsynchronized

解决方案


如果您 synchronize m2,将涉及一些开销,因为在进入m2线程时仍然必须获取b对象上的锁(如果锁总是空闲的事件)。

如果启用了转义分析, JVM可能会发现同步是多余的并对其进行优化(即删除synchronizedfrom m2) 。如果代码得到优化,就不会有性能差异。删除冗余同步的优化称为锁省略锁粗化

有关逃逸分析的更多详细信息,请参见以下链接


推荐阅读