Изменения документа ConcurrentDictionary
Редактировал(а) Alexandr Fokin 2023/02/16 01:41
<
>
отредактировано Alexandr Fokin
на 2022/01/03 15:31
на 2022/01/03 15:31
отредактировано Alexandr Fokin
на 2021/05/15 14:38
на 2021/05/15 14:38
Изменить комментарий:
Update document after refactoring.
Комментарий
-
Свойства страницы (1 изменено, 0 добавлено, 0 удалено)
Подробности
- Свойства страницы
-
- Содержимое
-
... ... @@ -1,18 +2,20 @@ 1 - 2 2 3 - **Описание работыметодаAddOrUpdate**:4 -В dictionary есть одно значение по ключу key1 - val1. 2 +Пример работы ConcurrentDictionary AddOrUpdate: 3 +В dictionary есть одной значение по ключу key1 - val1. 5 5 6 -1 )Поток th1 запускает Update делегат по ключу key1. (Фиксирует текущее значение th1_v)7 -2 )Поток th2 запускает Update делегат по ключу key1. (Фиксирует текущее значение th2_v)8 -3 )Поток th2 заканчивает выполнение делегата Update. th1 сравнивает val1 = th2_v (Через equils).9 - 10 -4 )Поток th1 заканчивает выполнение делегата Update. th2 сравнивает val1 = th1_v (Через equils).11 - 12 - 13 - чению val1.5 +1 Поток th1 запускает Update делегат по ключу key1. (Фиксирует текущее значение th1_v) 6 +2 Поток th2 запускает Update делегат по ключу key1. (Фиксирует текущее значение th2_v) 7 +3 Поток th2 заканчивает выполнение делегата Update. th1 сравнивает val1 = th2_v (Через equils). 8 + Значение равны и th2 сохраняет результат. 9 +4 Поток th1 заканчивает выполнение делегата Update. th2 сравнивает val1 = th1_v (Через equils). 10 + Значение НЕ равны и th2 повторно вызывает Update делегат. 11 + (Если элемент был удален, то запустить делегат Add) 12 + !Повторного вызова делегата не произойдет, в случает если результат работы th2 эквивалентен исходному начальному знаечнию val1. 14 14 15 -Получается, что ни вызов AddOrUpdate, ни вызов конкретного делегата (Add/Update) сам по себе не блокирует значение в коллекции и не препятствует в изменении другим ипотокам.14 +Получается, что ни вызов AddOrUpdate, ни вызов конкретного делегата (Add/Update) сам по себе не блокирует значение в коллекции и не препятствует в изменении другим потокам. 16 16 17 -По сути мы получаем **оптимистичную блокировку**. В случае неудачи которой, повторно вызывается действие обработки (add/update) для измененного значения по указанному ключу. 18 -Критерием сравнения блокировки является Equils. В таком случае возможно имеет смысл перегрузка Equils и наличии в сущности некоторого ключевого поля. Нечто вроде Change Version TimeStamp. 16 +По сути мы получаем **оптимистичную блокировку**. В случае неудачи которой, повторно вызывается действие обработки (add/update) в нового значения по указанному ключу. Критерием сравнения блокировки является Equils. В таком случае возможно имеет смысл перегрузка Equils и наличии в сущности некоторого ключевого поля. Нечто вроде Change Version TimeStamp. 17 + 18 + 19 +Ссылки: 20 +[[Базы данных/Транзакции и блокировки>>https://wiki.denhome.ru/bin/view/Разработка/Базы%20данных/Транзакции%20и%20блокировки/]]