Назад к вопросам
Junior — Middle
66
Каким образом реализовать потокобезопасное создание единственного экземпляра шаблона Singleton в условиях многопоточности?
Ответ от нейросети
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гарантирует видимость изменений экземпляра во всех потоках.- Первая проверка
if (instance == null)позволяет избежать блокировки после инициализации. - Вторая проверка внутри
synchronizedзащищает от создания нескольких экземпляров при одновременном доступе.
Альтернативно, можно использовать инициализацию через статический вложенный класс, что тоже потокобезопасно и проще:
public class Singleton {
private Singleton() {}
private static class Holder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return Holder.INSTANCE;
}
}