Ответ
Double-Checked Locking (DCL) — это шаблон проектирования, оптимизирующий ленивую инициализацию синглтона в многопоточной среде. Его цель — минимизировать накладные расходы на синхронизацию, проверяя блокировку только при первом создании объекта.
Пример реализации на Java:
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) — позволяет избежать дорогостоящей операции блокировки при каждом вызове метода после инициализации. - Вторая проверка — гарантирует, что только один поток создаст экземпляр, если несколько потоков одновременно прошли первую проверку.
Современная альтернатива: В Java для ленивой инициализации синглтона часто используют паттерн Initialization-on-demand holder, который безопасен и эффективен благодаря особенностям загрузки классов JVM.
public class Singleton {
private Singleton() {}
private static class Holder {
static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return Holder.INSTANCE;
}
}