gpt4 book ai didi

java - 使用 AtomicReference 的单例

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:57:02 26 4
gpt4 key购买 nike

使用 AtomicReference 的惰性初始化单例的实现是否正确?如果不是 - 可能的问题是什么?

import java.io.ObjectStreamException;
import java.io.Serializable;
import java.util.concurrent.atomic.AtomicReference;

public class Singleton implements Serializable {

private static final Singleton _instance = new Singleton();

private static AtomicReference<Singleton> instance = new AtomicReference<Singleton>();

private Singleton() {
}

public static Singleton getInstance() {
if (instance.compareAndSet(null, _instance)) {
synchronized (_instance) {
_instance.init();
instance.set(_instance);
}
}
return instance.get();
}

private void init() {
// do initialization
}

private Object readResolve() throws ObjectStreamException {
return getInstance();
}

}

最佳答案

不,这很糟糕:

public static Singleton getInstance() {
// new "singleton" for every method call
Singleton s = new Singleton();
^^^^^^^^^^^^^^
if (instance.compareAndSet(null, s)) {
synchronized (s) {
s.init();
}
}
return instance.get();
}

使用 AtomicReference 是个好主意,但它行不通,因为 Java 没有惰性求值。


经典的 post 1.5 单例方法是:

渴望单例:

public final class Singleton{
private Singleton(){}
private static final Singleton INSTANCE = new Singleton();
public Singleton getInstance(){return INSTANCE;}
}

带有内部 holder 类的惰性单例:

public final class Singleton{
private Singleton(){}
private static class Holder{
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance(){return Holder.INSTANCE;}
}

枚举单例:

public enum Singleton{
INSTANCE;
}

你可能应该坚持其中之一

关于java - 使用 AtomicReference 的单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5938163/

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