Double Checked Locking Singleton (синглтон с двойной проверкой блокировки) - это особый подход к созданию синглтона в Java, который обеспечивает ленивую инициализацию объекта с возможностью синхронизации при многопоточном доступе.
Основная идея double checked locking singleton заключается в использовании блока синхронизации только для первого доступа к созданию экземпляра синглтона. После этого блокировка не применяется, чтобы избежать накладных расходов на синхронизацию для каждого последующего доступа к синглтону.
Пример реализации Double Checked Locking Singleton:
public class DoubleCheckedLockingSingleton {
private static volatile DoubleCheckedLockingSingleton instance;
private DoubleCheckedLockingSingleton() {
// Приватный конструктор }
public static DoubleCheckedLockingSingleton getInstance() {
if (instance == null) { // Первая проверка без синхронизации
synchronized (DoubleCheckedLockingSingleton.class) {
if (instance == null) { // Вторая проверка с синхронизацией
instance = new DoubleCheckedLockingSingleton();
}
}
}
return instance;
}
}
В этом примере переменная instance объявлена как volatile, что гарантирует видимость изменений переменной между потоками. Первая проверка instance == null выполняется без синхронизации для обеспечения более высокой производительности. Если объект уже создан и переменная instance не является null, блокировка не требуется.
Однако, при первом доступе к синглтону, когда instance == null, поток входит в синхронизированный блок для создания экземпляра синглтона. Это позволяет только одному потоку получить доступ к этому блоку, а остальные потоки будут ожидать вне блока. После создания экземпляра instance, остальные потоки, которые ожидали за пределами синхронизированного блока, больше не требуют блокировки.
Double checked locking singleton обеспечивает ленивую инициализацию объекта синглтона и хорошую производительность при многопоточном доступе. Однако, его реализация может быть сложной и подвержена ошибкам, связанным с порядком инициализации и видимостью изменений переменных между потоками. С появлением Java 5 и последующих версий, предпочтительным способом создания синглтона стал использование статического вложенного класса (static nested class) или перечисления (enum) вместо double checked locking singleton.
1606 вопрос-ответ по Java: https://github.com/DEBAGanov/interview_questions
Tелеграмм канал: https://t.me/DEBAGanov
Мое резюме: https://github.com/DEBAGanov