嵌套同步方法的开销



考虑以下两个示例:

示例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?

如果同步m2,则会涉及一些开销,因为在输入m2时,线程仍必须获取b对象上的锁(如果锁总是空闲则发生事件(。

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

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

最新更新