考虑以下 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?
最佳答案
如果同步 m2
,则会产生一些开销,因为进入 m2
时线程仍必须获取 b
上的锁> 对象(锁始终空闲的事件)。
JVM可能发现同步是多余的并对其进行优化(即从m2
中删除synchronized
)如果转义分析已启用。如果代码得到优化,就不会有性能差异。消除冗余同步的优化称为“锁省略”或“锁粗化”。
有关逃逸分析的更多详细信息,请参阅以下内容 link .
关于java - 嵌套同步方法的开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53020099/