Назад к вопросам
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
В представленном коде есть несколько ошибок:
- Поле
instanceобъявлено какfinal, но инициализируется не сразу — это невозможно. - В методе
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для корректного видения изменений в разных потоках.- Синхронизация происходит на классе, а не на экземпляре.
- Конструктор приватный, чтобы предотвратить создание экземпляров извне.