0

我基本上是在为 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 类以使构造函数私有。我也不想。
  • 要求规定不应急切地实例化助手
4

1 回答 1

2

从 Java 5 开始,该实现是安全的。但是,请考虑改用内部类:

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

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

这既提供了线程安全和延迟初始化,又利用了类初始化的线程安全保证来避免每次调用的易失性或同步关键字。

于 2015-04-27T15:02:49.493 回答