这是双重检查单身人士的正确用法吗?

时间:2015-04-27 14:45:15

标签: java static singleton wrapper double-checked-locking

我基本上是在寻找HelperWrapper用户的缓存机制。 这是双重检查单身的正确用法吗?

final class HelperWrapper {
  private static volatile Helper helper = null;
 
  public static Helper getHelper() {
    if (helper == null) {
      synchronized (HelperWrapper.class) {
        if (helper == null) {
          helper = new Helper();
        }
      }
    }
    return helper;
  }
}

我知道这不会阻止某人实例化他们自己的Helper对象,但这不是目标。

其他信息:

  • 我无法修改Helper类以使构造函数成为私有。我也不想。
  • 要求规定帮助者不应急切地实例化

1 个答案:

答案 0 :(得分:2)

从Java 5开始,该实现is safe。但是,请考虑使用内部类:

final class HelperWrapper {
  private static final class DeferredLoader {
    public static final Helper HELPER_INSTANCE = new Helper();
  } 

  public static Helper getHelper() {
    return DeferredLoader.HELPER_INSTANCE;
  }
}

这两者都提供线程安全和延迟初始化,同时利用类初始化的线程安全保证,以避免基于每个调用的volatile或同步关键字。