java - 嵌套同步方法的开销

标签 java multithreading synchronization synchronized

考虑以下 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/

相关文章:

java - 关键部分在 onSensorChanged() 中不起作用

java - MyBatis多数据源配置问题

java - 使用 @Async 注释限制线程数并在达到最大线程数时等待

browser - 跨浏览器历史同步

session - 如何在 Firefox 中跨设备同步 "session manager" session ?

ios - 如何同步 AVPlayer 和 MTKView

Java JAI BufferedImage 与 C++ OpenCV Mat imread?

java - 为什么 Iterable<E> 和 Iterator<E> 在不同的包中?

c# - 在 C# 中单击按钮停止线程

vb.net - VB.NET 中的 Me.Invoke 实际上并不是 "Invoke"- 线程在 Invoke 语句上停滞