Senior
29
Расскажи про паттерн Singleton и его реализацию в конкурентной среде
Companies where asked
Octo
Answer from AI
sobes.tech AI
Паттерн Singleton гарантирует, что у класса есть только один экземпляр, и предоставляет глобальную точку доступа к нему.
В конкурентной среде важно обеспечить потокобезопасность при создании экземпляра, чтобы избежать создания нескольких объектов при одновременном доступе из разных потоков.
Один из распространённых способов реализации в Java — использование ленивой инициализации с двойной проверкой блокировки (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;
}
}
Здесь volatile гарантирует корректную работу с памятью, а двойная проверка снижает накладные расходы на синхронизацию после инициализации.
Альтернативы:
- Использование инициализации через статический вложенный класс (Initialization-on-demand holder idiom), которая потокобезопасна и проще.
public class Singleton {
private Singleton() {}
private static class Holder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return Holder.INSTANCE;
}
}
Этот способ гарантирует ленивую инициализацию и потокобезопасность без синхронизации.