嵌套同步方法的开销

时间:2018-10-27 08:34:18

标签: java multithreading synchronization synchronized

请考虑以下两个示例:

示例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()保护,那么同步的成本是多少?即,与示例1相比,示例2是否增加了任何开销? JVM是否对示例2进行了优化以使其类似于示例1?

1 个答案:

答案 0 :(得分:1)

如果同步m2,则将涉及一些开销,因为当输入m2时,线程仍必须获取b对象上的锁(如果锁是永远免费)。

JVM 可能 认为,如果转义,同步是多余的并对其进行优化(即从synchronized中删除m2)分析已启用。如果代码得到优化,则不会有性能差异。消除冗余同步的优化称为 lock Elision lock粗化

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