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

Как решить проблему с ленивой инициализацией

Ленивая инициализация — это отложенное создание объекта до момента его первого использования. В Java её можно реализовать несколькими способами:

  1. Проверка в методе (не потокобезопасно):
java
private HeavyObject heavy;
public HeavyObject getHeavy() {
    if (heavy == null) {
        heavy = new HeavyObject();
    }
    return heavy;
}
  1. Синхронизированный метод (потокобезопасно, но медленно):
java
private HeavyObject heavy;
public synchronized HeavyObject getHeavy() {
    if (heavy == null) {
        heavy = new HeavyObject();
    }
    return heavy;
}
  1. Double-Checked Locking (оптимально для многопоточности):
java
private volatile HeavyObject heavy;
public HeavyObject getHeavy() {
    if (heavy == null) {
        synchronized (this) {
            if (heavy == null) {
                heavy = new HeavyObject();
            }
        }
    }
    return heavy;
}
  1. Использование Holder-класса (лучший способ):
java
private static class Holder {
    static final HeavyObject INSTANCE = new HeavyObject();
}
public static HeavyObject getHeavy() {
    return Holder.INSTANCE;
}

Для ленивой инициализации в современных приложениях лучше использовать Supplier из Java 8 или фреймворки типа Spring (@Lazy).

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

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

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

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