java - 嵌套同步方法的开销
问题描述
考虑以下 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?
解决方案
如果您 synchronize m2
,将涉及一些开销,因为在进入m2
线程时仍然必须获取b
对象上的锁(如果锁总是空闲的事件)。
如果启用了转义分析, JVM可能会发现同步是多余的并对其进行优化(即删除synchronized
from m2
) 。如果代码得到优化,就不会有性能差异。删除冗余同步的优化称为锁省略或锁粗化。
有关逃逸分析的更多详细信息,请参见以下链接。
推荐阅读
- syntax-error - 大括号内的引号替换为 @ 并引发解析错误
- javascript - 即使在将事件绑定到页面文档 DOM 之后,jQuery 单击事件也无法正常工作
- postgresql - 在 PostgreSQL 中两次加入同一个表的最佳方法是什么?
- python-3.x - pandas.series.split(' ',expand =True) 带列名
- kubernetes - 如何将主机路径与入口中的服务路径映射?
- python - 如何防止在 MatlabR2018b 中加载后保存的 Python .mat 文件的像素值减少或丢失?
- php - setlocale() 函数返回 false
- javascript - npm 错误!尝试安装 express 时出现代码 EAI_AGAIN 错误
- ios - GradientLayer 在 iOS Swift App 中移动到左上角
- javascript - 是否可以选择离子切换更改变量值及其属性