Студопедия

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника



Синхронизация потоков при создании общих данных с помощью двойных проверок (double-checked locking).




Читайте также:
  1. A. осуществляет передачу данных устройствам компьютера.
  2. B) Элемент диаграммы, показывающий название и маркеры данных диаграммы
  3. E) схема данных.
  4. II. Системы, развитие которых можно представить с помощью Универсальной Схемы Эволюции
  5. III. Решение логических задач с помощью рассуждений
  6. Lt;variant>возлагается. Эта обязанность состоит в том, что обвиняемому дозволяется обратиться за юридической помощью
  7. lt;variant>Эта обязанность состоит в том, что обвиняемому дозволяется обратиться за юридической помощью
  8. MS Access. На основе данных перечисленных объектов можно создать Форму.
  9. А) Информация из специализированных баз данных;
  10. Абстрактные структуры данных
Помощь в написании учебных работ
1500+ квалифицированных специалистов готовы вам помочь

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

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

// Неработающая многопоточная версия

// Шаблон "Double-Checked Locking"

class Foo {

private Helper helper = null;

public Helper getHelper() {

if (helper == null) {

synchronized(this) {

if (helper == null) {

helper = new Helper();

}

}

}

return helper;

}

 

// и остальные члены класса…

}

На интуитивном уровне, этот код кажется корректным. Однако, существуют некоторые проблемы, которых следует избежать. Представим себе, что события в многопоточной программе протекают так:

Поток А замечает, что переменная не инициализирована, затем получает блокировку и начинает инициализацию.

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

Поток Б замечает, что переменная инициализирована (по крайней мере, ему так кажется), и возвращает значение переменной без получения блокировки. Если поток Б теперь будет использовать переменную до того момента, когда поток А закончит инициализацию, поведение программы будет некорректным.

Одна из опасностей использования блокировки с двойной проверкой в J2SE 1.4 (и более ранних версиях) состоит в том, что часто кажется, что программа работает корректно. Во-первых, рассмотренная ситуация будет возникать не очень часто; во-вторых, сложно отличить корректную реализацию данного шаблона от такой, которая имеет описанную проблему. В зависимости от компилятора, распределения планировщиком процессорного времени для потоков, а также природы других работающих конкурентных процессов, ошибки, спровоцированные с некорректной реализацией блокировки с двойной проверкой, обычно происходят бессистемно. Воспроизведение таких ошибок обычно затруднено.

 

Доверь свою работу кандидату наук!
1500+ квалифицированных специалистов готовы вам помочь

Дата добавления: 2015-01-29; просмотров: 13; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2022 год. (0.01 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты