Back to questions
Junior — Middle
55
Чем отличается реализация паттерна Singleton, использующего своевременную и отсроченную инициализацию?
Answer from AI
sobes.tech AI
Разница между своевременной (eager) и отсроченной (lazy) инициализацией Singleton заключается в моменте создания единственного экземпляра класса:
- Своевременная инициализация (eager) — объект создаётся сразу при загрузке класса. Это просто и потокобезопасно, но объект создаётся даже если он не будет использован.
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
- Отсроченная инициализация (lazy) — объект создаётся при первом вызове
getInstance(). Это экономит ресурсы, но требует дополнительной синхронизации для потокобезопасности.
Пример с двойной проверкой блокировки (Double-checked locking):
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;
}
}
Таким образом, выбор зависит от требований к производительности и ресурсам.