请考虑以下两个示例:
示例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?
答案 0 :(得分:1)
如果同步m2
,则将涉及一些开销,因为当输入m2
时,线程仍必须获取b
对象上的锁(如果锁是永远免费)。
JVM 可能 认为,如果转义,同步是多余的并对其进行优化(即从synchronized
中删除m2
)分析已启用。如果代码得到优化,则不会有性能差异。消除冗余同步的优化称为 lock Elision 或 lock粗化。
有关逃逸分析的更多详细信息,请参见以下link。