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

Каким образом реализовать потокобезопасное создание единственного экземпляра шаблона Singleton в условиях многопоточности?

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

sobes.tech AI

Для потокобезопасного создания единственного экземпляра Singleton в Java часто используют паттерн с ленивой инициализацией и двойной проверкой блокировки (Double-Checked Locking). Это позволяет избежать лишней синхронизации после того, как экземпляр уже создан.

Пример реализации:

public class Singleton {
    private static volatile Singleton instance;

    private Singleton() {
        // приватный конструктор
    }

    public static Singleton getInstance() {
        if (instance == null) { // первая проверка без блокировки
            synchronized (Singleton.class) {
                if (instance == null) { // вторая проверка внутри блокировки
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

Ключевые моменты:

  • volatile гарантирует видимость изменений экземпляра во всех потоках.
  • Первая проверка if (instance == null) позволяет избежать блокировки после инициализации.
  • Вторая проверка внутри synchronized защищает от создания нескольких экземпляров при одновременном доступе.

Альтернативно, можно использовать инициализацию через статический вложенный класс, что тоже потокобезопасно и проще:

public class Singleton {
    private Singleton() {}

    private static class Holder {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return Holder.INSTANCE;
    }
}