Sobes.tech
Назад к вопросам
Junior
5

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

Компании, где спрашивали
ИП Ганус Александр Андреевич

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

sobes.tech AI

В представленном коде есть несколько ошибок и недочётов:

  1. Поле instance объявлено как static final, но не инициализировано, что вызовет ошибку компиляции.
  2. Конструктор public, что позволяет создавать новые экземпляры вне класса, нарушая паттерн Singleton.
  3. Метод getInstance() не статический, а должен быть статическим, чтобы его можно было вызвать без создания объекта.
  4. Логика двойной проверки блокировки реализована неверно: сначала проверяется instance != null, а затем внутри синхронизации проверяется instance == null — это бессмысленно.

Правильная реализация Singleton с ленивой инициализацией и двойной проверкой блокировки на 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;
    }
}

Здесь volatile гарантирует корректную работу с памятью, а метод getInstance() статический и реализует потокобезопасный ленивый Singleton.