Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Design Patterns by D.pdf
Скачиваний:
25
Добавлен:
19.02.2016
Размер:
2.57 Mб
Скачать

Double checked locking - Блокировка с двойной проверкой

Double checked locking (блокировка с двойной проверкой) — шаблон проектирования, применяющийся в параллельном программировании. Он предназначен для уменьшения накладных расходов, связанных с получением блокировки. Сначала проверяется условие блокировки без какой-либо синхронизации; поток делает попытку получить блокировку только если результат проверки говорит о том, что ни один другой поток не владеет блокировкой.

На некоторых языках и/или на некоторых машинах невозможно безопасно реализовать данный шаблон. Поэтому иногда его называют анти-паттерном.

Обычно он используется для уменьшения накладных расходов при реализации ленивой инициализации в многопоточных программах, например в составе шаблона проектирования Одиночка. При ленивой инициализации переменной, инициализация откладывается до тех пор, пока значение переменной не понадобится при вычислениях.

Пример реализации

Microsoft подтверждает, что при использовании ключевого слова volatile, использование паттерна Double checked locking является безопасным.

public sealed class Singleton

{

private Singleton()

{

// инициализировать новый экземпляр объекта

}

private static volatile Singleton singletonInstance;

private static readonly Object syncRoot = new Object();

public static Singleton GetInstance()

{

// создан ли объект

if (singletonInstance == null)

{

//нет, не создан

//только один поток может создать его lock (syncRoot)

{

//проверяем, не создал ли объект другой поток if (singletonInstance == null)

{

// нет не создал — создаём singletonInstance = new Singleton();

}

}

}

return singletonInstance;

}

}

37

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]