首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >针对嵌套同步块的HotSpot JVM优化

针对嵌套同步块的HotSpot JVM优化
EN

Stack Overflow用户
提问于 2014-07-21 09:15:45
回答 2查看 256关注 0票数 1

OracleJDK7和8中的HotSpot JVM是否针对在同一对象上同步的嵌套synchronized块进行了优化?

例如,第一个代码清单(类A)和第二个代码清单(类B)一样有效吗?(类B避免了类A中出现的嵌套synchronized (x) )

代码语言:javascript
复制
public class A {
    private final Object x = new Object();

    public void a() {
        synchronized (x) {
            // code snippet 1
            b();
            // code snippet 2
        }
    }

    public void b() {
        synchronized (x) {
            // code snippet 3
        }
    }
}

public class B {
    private final Object x = new Object();

    public void a() {
        synchronized (x) {
            // code snippet 1
            c();
            // code snippet 2
        }
    }

    public void b() {
        synchronized (x) {
            c();
        }
    }

    private void c() {
        // code snippet 3
    }
}
EN

回答 2

Stack Overflow用户

发布于 2014-07-22 06:33:17

是的,JDK 7中甚至出现了一个VM选项(默认情况下是打开的):

代码语言:javascript
复制
-XX:+EliminateNestedLocks

但是,它似乎只在监视器对象为static final或锁定this对象时才起作用。

票数 1
EN

Stack Overflow用户

发布于 2014-07-21 09:51:29

b短到可以内联的情况下,我希望如此。否则不会,因为过程间的分析太复杂了,而且收益有限(不能内联的东西可能需要很长的时间,一些开销是可以接受的)。但是,您仍然可以从偏向锁定中获益。

这只是一个猜测,但即使是JDK6也有lock coarsening,它可以被认为是您所询问的更复杂的版本。在内联之后,我们有

代码语言:javascript
复制
public void a() {
    synchronized (x) {
        // code snippet 1
        synchronized (x) {
            // code snippet 3
        }
        // code snippet 2
    }
}

而锁的粗化开始于类似这样的东西

代码语言:javascript
复制
public void a() {
    synchronized (x) {
        // code snippet 1
    }
    synchronized (x) {
        // code snippet 3
    }
    synchronized (x) {
        // code snippet 2
    }
}

这是一个更复杂的情况,因为在这里加入同步块可能会降低吞吐量,而在您的情况下,绝对不会有任何损失。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24856486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档