Sobes.tech
Назад к вопросам
Middle — Middle+
65

Можно ли считать реализацию паттерна Singleton безопасной с точки зрения многопоточности?

Компании, где спрашивали
ylab

Ответ от нейросети

sobes.tech AI

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

Для обеспечения потокобезопасности в Java используют несколько подходов:

  • Синхронизация метода получения экземпляра:

    public class Singleton {
        private static Singleton instance;
    
        public static synchronized Singleton getInstance() {
            if (instance == null) {
                instance = new Singleton();
            }
            return instance;
        }
    }
    

    Минус — снижение производительности из-за синхронизации при каждом вызове.

  • Двойная проверка с volatile:

    public 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;
        }
    }
    

    Позволяет избежать лишней синхронизации после инициализации.

  • Использование инициализации через статический вложенный класс:

    public class Singleton {
        private Singleton() {}
    
        private static class Holder {
            private static final Singleton INSTANCE = new Singleton();
        }
    
        public static Singleton getInstance() {
            return Holder.INSTANCE;
        }
    }
    

    Этот способ потокобезопасен и ленив, так как класс Holder загружается только при первом вызове getInstance().

Таким образом, чтобы считать Singleton потокобезопасным, нужно использовать соответствующие механизмы синхронизации или паттерны инициализации.