我在静态工厂方法中编写了以下代码,以返回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)。