Ответ
Double-Checked Locking (DCL) — это паттерн оптимизации для ленивой инициализации синглтона в многопоточной среде. Его цель — минимизировать накладные расходы на синхронизацию, блокируя код создания экземпляра только при первом вызове.
Типичная реализация на Java (с Java 5+):
public class Singleton {
// Ключевое слово volatile обязательно для корректной публикации объекта
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? Без него другой поток может увидеть ссылку instance, которая уже не null, но указывает на частично инициализированный объект (проблема неупорядоченной публикации). Модификатор volatile гарантирует завершение инициализации до того, как ссылка станет видна другим потокам.
Когда применять? Для дорогих в создании объектов, когда ленивая инициализация критична для производительности. В современных Java для синглтонов часто предпочитают статический holder класс (Initialization-on-demand holder idiom) или enum, которые безопасны по умолчанию.