Sobes.tech
Назад к вопросам
Junior — Middle
66

Каким образом реализовать шаблон Singleton с отложенной инициализацией в Java?

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

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

sobes.tech AI

В Java шаблон Singleton с отложенной инициализацией можно реализовать несколькими способами. Один из распространённых — использование ленивой инициализации с синхронизацией, чтобы обеспечить потокобезопасность:

public class Singleton {
    private static Singleton instance;

    private Singleton() {
        // приватный конструктор
    }

    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

Однако синхронизация метода может снижать производительность. Более эффективный способ — использование "двойной проверки блокировки":

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

Также можно использовать статический вложенный класс, который гарантирует ленивую инициализацию и потокобезопасность без синхронизации:

public class Singleton {
    private Singleton() {}

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

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