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

Is this a correct use of double checked singleton?

我基本上是在为 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 对象,但这不是目标。

附加信息:

截至 Java 5,该实施 is safe。但是,请考虑改用内部 class:

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

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

这两者都提供线程安全和惰性初始化,同时利用 class 初始化的线程安全保证来避免每次调用时使用 volatile 或同步关键字。