Sobes.tech
Senior
28

Расскажи про паттерн Singleton и его реализацию в конкурентной среде

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

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

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 гарантирует корректную работу с памятью, а двойная проверка снижает накладные расходы на синхронизацию после инициализации.

Альтернативы:

  • Использование инициализации через статический вложенный класс (Initialization-on-demand holder idiom), которая потокобезопасна и проще.
public class Singleton {
    private Singleton() {}

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

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

Этот способ гарантирует ленивую инициализацию и потокобезопасность без синхронизации.