Sobes.tech
Back to questions
Junior — Middle
55

Чем отличается реализация паттерна Singleton, использующего своевременную и отсроченную инициализацию?

Answer from AI

sobes.tech AI

Разница между своевременной (eager) и отсроченной (lazy) инициализацией Singleton заключается в моменте создания единственного экземпляра класса:

  • Своевременная инициализация (eager) — объект создаётся сразу при загрузке класса. Это просто и потокобезопасно, но объект создаётся даже если он не будет использован.
public class Singleton {
    private static final Singleton instance = new Singleton();

    private Singleton() {}

    public static Singleton getInstance() {
        return instance;
    }
}
  • Отсроченная инициализация (lazy) — объект создаётся при первом вызове getInstance(). Это экономит ресурсы, но требует дополнительной синхронизации для потокобезопасности.

Пример с двойной проверкой блокировки (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;
    }
}

Таким образом, выбор зависит от требований к производительности и ресурсам.