java – 同步方法调用同步方法的同步成本是多少?

这个之间的性能有什么区别吗?

synchronized void x() {
    y();
}

synchronized void y() {
}

和这个

synchronized void x() {
    y();
}

void y() {
}
最佳答案
是的,还有一个额外的性能成本,除非和直到JVM内嵌对y()的调用,现代JIT编译器将在相当短的时间内执行.首先,考虑你所呈现的,在类外面可以看到y()的情况.在这种情况下,JVM必须检查输入y()以确保它可以进入对象的监视器;当这个呼叫来自x()时,此检查将始终成功,但不能跳过,因为该呼叫可能来自课堂外的客户端.这个附加支票需要很小的成本.

另外,考虑y()是私有的情况.在这种情况下,编译器仍然不能优化同步;请参阅以下拆卸空的y():

private synchronized void y();
  flags: ACC_PRIVATE, ACC_SYNCHRONIZED
  Code:
    stack=0, locals=1, args_size=1
       0: return

According to the spec’s definition of synchronized,每个进入同步块或方法的入口对对象执行锁定动作,并执行解锁操作.没有其他线程可以获取对象的监视器,直到锁定计数器下降到零.可能某种静态分析可以证明,私有同步方法只能从其他同步方法中被调用,但是Java的多源文件支持将使脆弱性最大化,甚至忽略反射. This means that the JVM must still increment the counter on entering y():

Monitor entry on invocation of a synchronized method, and monitor exit on its return, are handled implicitly by the Java Virtual Machine’s method invocation and return instructions, as if monitorenter and monitorexit were used.

@AmolSonawane correctly notes JVM可以通过执行锁定粗化来在运行时优化此代码,基本上是内联y()方法.在这种情况下,在JVM决定执行JIT优化后,从x()到y()的调用不会产生任何额外的性能开销,但当然直接从任何其他位置调用y()的调用仍然需要获取监视器分开.

转载注明原文:java – 同步方法调用同步方法的同步成本是多少? - 代码日志