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

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

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

Вариант с внутренним классом (рекомендуется):

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

Double-checked locking (для старых версий Java):

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

Первый вариант предпочтительнее - он потокобезопасен без synchronized и работает быстрее. Второй вариант нужен, если требуется ленивая инициализация в Java версии ниже 5 (где volatile работал иначе).

Sophi
Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
Попробовать бесплатноArrow

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

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

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