Sobes.tech
Back to questions
Junior
4

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

Companies where asked
ИП Ганус Александр Андреевич

Answer from AI

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.