Что такое шаблон Double-Checked Locking (DCL) в программировании?

«Что такое шаблон Double-Checked Locking (DCL) в программировании?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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;
    }
}

Ключевые аспекты:

  1. volatile — предотвращает проблему частичной инициализации из-за переупорядочивания инструкций компилятором или процессором.
  2. Первая проверка (instance == null) — позволяет избежать дорогостоящей операции блокировки при каждом вызове метода после инициализации.
  3. Вторая проверка — гарантирует, что только один поток создаст экземпляр, если несколько потоков одновременно прошли первую проверку.

Современная альтернатива: В 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;
    }
}