Нет, это плохо:
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:
Eager Singleton:
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;
}
Вы, вероятно, должны придерживаться одного из этих