gpt4 book ai didi

java - 创建单例实例的工厂方法

转载 作者:搜寻专家 更新时间:2023-10-31 19:29:11 26 4
gpt4 key购买 nike


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

关于java - 创建单例实例的工厂方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13955614/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com