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
В представленном коде есть несколько ошибок и недочётов:
- Поле
instanceобъявлено какstatic final, но не инициализировано, что вызовет ошибку компиляции. - Конструктор
public, что позволяет создавать новые экземпляры вне класса, нарушая паттерн Singleton. - Метод
getInstance()не статический, а должен быть статическим, чтобы его можно было вызвать без создания объекта. - Логика двойной проверки блокировки реализована неверно: сначала проверяется
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.