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

Каким образом реализация паттерна Singleton учитывает особенности многопоточности?

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

sobes.tech AI

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

  • Синхронизация (synchronized): метод получения экземпляра блокируется, чтобы только один поток мог создать объект.

  • Двойная проверка блокировки (Double-checked locking): сначала проверяется, создан ли экземпляр без блокировки, затем внутри блока синхронизации создаётся экземпляр, если он ещё не создан.

  • Использование volatile: переменная экземпляра объявляется volatile, чтобы избежать проблем с кэшированием и переупорядочиванием инструкций.

  • Инициализация при загрузке класса (Initialization-on-demand holder idiom): вложенный статический класс содержит экземпляр, который создаётся при первом обращении, что гарантирует потокобезопасность без синхронизации.

Пример с двойной проверкой блокировки в Java:

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