nonblocking singleton
От: Alstresh Россия  
Дата: 27.10.11 10:15
Оценка:
Есть известная реализация синглтона

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();
    }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.