我在静态工厂方法中编写了以下代码,以返回DefaultCache的单个实例。

public static ICache getInstance() {
   if (cacheInstance == null) {
      synchronized (ICache.class) {
         if (cacheInstance == null) {
            cacheInstance = new DefaultCache();
         }
      }
   }
   return cacheInstance;
}

我们是否真的需要在同步块(synchronized block)内对cacheInstance进行第二次空检查?

最佳答案

您需要进行第二次检查,因为尝试获取锁时该值可能已由另一个线程设置。实际上,只有在同步块(synchronized block)内,您才可以安全地查看该值。可以在任何时间之前由另一个线程设置它。

最简单的懒惰单例是使用枚举

public enum DefaultCache implements ICache {
     INSTANCE
}

我假设您没有这样做,所以您可以更改实现。

顺便说一句:我建议您仅在可能的情况下使用无状态单例,并尽可能对所有有状态对象使用依赖注入(inject)。

10-04 23:23