Sobes.tech
Назад к вопросам
Middle+
3

Что нужно изменить в этом коде, чтобы была корректная потокобезопасная реализация паттерна Синглтон? 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 объявлено как final, но инициализируется не сразу — это невозможно.
  2. В методе getInstance() проверка и синхронизация сделаны неправильно.

Правильная потокобезопасная реализация с ленивой инициализацией и двойной проверкой выглядит так:

public class Singleton {
    private static volatile Singleton instance;

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

    public static Singleton getInstance() {
        if (instance == null) { // первая проверка без синхронизации
            synchronized (Singleton.class) {
                if (instance == null) { // вторая проверка внутри synchronized
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

Ключевые моменты:

  • instance должна быть static volatile для корректного видения изменений в разных потоках.
  • Синхронизация происходит на классе, а не на экземпляре.
  • Конструктор приватный, чтобы предотвратить создание экземпляров извне.