Junior — Middle
Каква е разликата между реализирането на патърна Singleton, който използва своевременна и отложена инициализация?
sobes.tech AI
Отговор от 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;
}
}
Таким образом, выбор зависит от требований к производительности и ресурсам.