Встречается на собеседованиях • сегодня

Как сделать ленивый Singleton в Java

Ленивая инициализация Singleton означает создание экземпляра только при первом вызове getInstance(). Вот потокобезопасный вариант с двойной проверкой (double-checked locking):

java
public class LazySingleton {
    private static volatile LazySingleton instance;

    private LazySingleton() {}

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

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

  1. volatile гарантирует видимость изменения instance для всех потоков
  2. Двойная проверка (if (instance == null)) минимизирует блокировки
  3. Приватный конструктор предотвращает создание экземпляров извне

Альтернатива - использование статического внутреннего класса (более простой и безопасный вариант):

java
public class LazySingleton {
    private LazySingleton() {}

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

    public static LazySingleton getInstance() {
        return Holder.INSTANCE;
    }
}
Sophi
Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
Попробовать бесплатноArrow

Следующий вопрос

Это единственный вопрос по вашему фильтру

как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы