我遇到了AtomicReference类,想知道这是否是创建一个可变且可以替换以进行测试的 Singleton 的好方法。
我知道双锁检查有问题,所以我不想走那条路。 自 JDK 1.5 起更正,https://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html。
此外,我更愿意懒惰地实例化单例而不是初始化它。例如,在测试期间,我不想使用默认类SimpleExample
,但在某些情况下,它要么创建成本高,要么在某些环境中存在问题。我希望能够在请求之前更换它。
public class SingletonExample {
private static AtomicReference<SingletonExample> sInstance = new AtomicReference<>();
private SingletonExample() {
}
public static SingletonExample getInstance() {
return sInstance.updateAndGet(u -> u != null ? u : new SingletonExample());
}
@VisibleForTesting
static void setInstance(SingletonExample singletonExample) {
sInstance.set(singletonExample);
}
}
以下是我的问题:
- 有很大的性能影响吗?
- 是否存在我不知道将其用作 Singleton 的问题?
- 什么是合理的选择?