不,这很糟糕:
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没有懒惰的评估.
经典的1.5单例方法是:
渴望单身人士:
public final class Singleton{
private Singleton(){}
private static final Singleton INSTANCE = new Singleton();
public Singleton getInstance(){return INSTANCE;}
}
懒惰单身人士,内部持有人类:
public final class Singleton{
private Singleton(){}
private static class Holder{
private static final Singleton INSTANCE = new Singleton();
}
public Singleton getInstance(){return Holder.INSTANCE;}
}
Enum Singleton:
public enum Singleton{
INSTANCE;
}
你应该坚持使用其中一个