首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何解决Java中的“双重检查锁被破坏”声明?

如何解决Java中的“双重检查锁被破坏”声明?
EN

Stack Overflow用户
提问于 2010-08-27 03:10:12
回答 6查看 23.9K关注 0票数 40

我想在Java中实现多线程的延迟初始化。

我有一些类似的代码:

代码语言:javascript
复制
class Foo {
    private Helper helper = null;
    public Helper getHelper() {
        if (helper == null) {
            Helper h;
            synchronized(this) {
                h = helper;
                if (h == null) 
                    synchronized (this) {
                        h = new Helper();
                    } // release inner synchronization lock
                helper = h;
            } 
        }    
        return helper;
    }
    // other functions and members...
}

我得到了“双重检查锁定被打破”的声明。

我该如何解决这个问题呢?

EN

回答 6

Stack Overflow用户

发布于 2010-08-27 03:21:47

以下是正确的双重检查锁定的模式。

代码语言:javascript
复制
class Foo {

  private volatile HeavyWeight lazy;

  HeavyWeight getLazy() {
    HeavyWeight tmp = lazy; /* Minimize slow accesses to `volatile` member. */
    if (tmp == null) {
      synchronized (this) {
        tmp = lazy;
        if (tmp == null) 
          lazy = tmp = createHeavyWeightObject();
      }
    }
    return tmp;
  }

}

对于单例,有一个更具可读性的习惯用法,用于惰性初始化。

代码语言:javascript
复制
class Singleton {
  private static class Ref {
    static final Singleton instance = new Singleton();
  }
  public static Singleton get() {
    return Ref.instance;
  }
}
票数 13
EN

Stack Overflow用户

发布于 2010-08-27 03:27:12

在Java中正确执行双重检查锁定的唯一方法是在相关变量上使用"volatile“声明。虽然该解决方案是正确的,但请注意,“易失性”意味着每次访问时都会刷新缓存线。因为"synchronized“会在块的末尾刷新它们,所以它实际上可能不会更有效(甚至更低)。我建议不要使用双重检查锁定,除非您已经对代码进行了概要分析,并且发现这方面存在性能问题。

票数 3
EN

Stack Overflow用户

发布于 2010-08-27 03:15:38

定义应使用volatile修饰符进行双重检查的变量

您不需要h变量。下面是来自here的一个示例

代码语言:javascript
复制
class Foo {
    private volatile Helper helper = null;
    public Helper getHelper() {
        if (helper == null) {
            synchronized(this) {
                if (helper == null)
                    helper = new Helper();
            }
        }
        return helper;
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3578604

复制
相关文章

相似问题

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