Junior — Middle
120
¿Cómo implementar la creación segura de hilos de una única instancia del patrón Singleton en condiciones de concurrencia?
Respuesta de la IA
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;
}
}