Есть известная реализация синглтона
final class Singleton {
private static volatile Singleton instance;
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
Но товарищ Allen Holub заметил, что использование volatile модификатора может привести к проблемам производительности на мультипроцессорных системах.
Покритикуйте использование не блокирющего алгоритма взамен синхронизации, например:
final class NonBlockSingleton {
private static final AtomicReference<NonBlockSingleton> ref = new AtomicReference<NonBlockSingleton>();
public static NonBlockSingleton getInstance() {
if (ref.get() == null) {
NonBlockSingleton instance = null;
do {
instance = new NonBlockSingleton();
} while (ref.compareAndSet(null, instance));
}
return ref.get();
}
}