Шаблон синглтона в многопоточности может иметь дублирующий код - PullRequest
0 голосов
/ 08 октября 2018

Я видел, что есть онлайн-учебник для Singleton, чтобы реализовать многопоточность и гарантировать, что экземпляр будет создан только один раз.В учебнике приведен код ниже, но в коде есть код дублирования, так как они хотят убедиться, что экземпляр не нулевой.

if(instance == null){} 

Однако эта проверка состояния появляется дважды, это дублирование?

    public class Singleton {
        private static Singleton instance;


        private Singleton(){
            //Here runs a lot code, that's why we don't want to instantiate here
        }

        // Using synchronized to ensure Singleton (only instantiate once) when 
        //implement multi threading.
        public static Singleton getInstance(){
            if(instance == null){
                synchronized(Singleton.class){
                    if(instance == null){
                        instance = new Singleton();
                    }    
                }
            } 
            return instance;
        }

    }

1 Ответ

0 голосов
/ 08 октября 2018

не дублируется.Это проверяется снова, потому что между первой проверкой if(instance == null) и блокировкой synchronized(Singleton.class) другой поток может создать его экземпляр и сломать синглтон.Проверьте разницу между первым кодовым блоком и вторым.

    public static Singleton getInstance(){
        if(instance == null){
            // Another thread could instantiate in this moment.
            synchronized(Singleton.class){
                instance = new Singleton(); // If another thread did already instantiate it, this would be the second call to the constructor.
            }
        } 
        return instance;
    }

Повторная проверка после того, как блокировка была выполнена, предотвращает это состояние гонки.

    public static Singleton getInstance(){
        if(instance == null){
            // Another thread could instantiate in this moment.
            synchronized(Singleton.class){
                // Now this code is thread safe
                if(instance == null){
                    // No other thread made a race condition before the first check and the locking. We can safely do the heavy work.
                    instance = new Singleton();
                }    
            }
        } 
        return instance;
    }
...