Изменения документа ConcurrentDictionary

Редактировал(а) Alexandr Fokin 2023/02/16 01:41

<
От версии < 10.1 >
отредактировано Alexandr Fokin
на 2020/07/08 09:34
К версии < 11.1 >
отредактировано Alexandr Fokin
на 2022/01/03 15:31
>
Изменить комментарий: К данной версии нет комментариев

Комментарий

Подробности

Свойства страницы
Родительский документ
... ... @@ -1,1 +1,1 @@
1 -Разработка.NET.C#.WebHome
1 +Разработка.NET.C#.Коллекции.Concurrent.WebHome
Содержимое
... ... @@ -1,20 +1,18 @@
1 +
1 1  
2 -Пример работы ConcurrentDictionary AddOrUpdate:
3 -В dictionary есть одной значение по ключу key1 - val1.
3 +**Описание работы метода AddOrUpdate**:
4 +В dictionary есть одно значение по ключу key1 - val1.
4 4  
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.
6 +1) Поток th1 запускает Update делегат по ключу key1. (Фиксирует текущее значение th1_v)
7 +2) Поток th2 запускает Update делегат по ключу key1. (Фиксирует текущее значение th2_v)
8 +3) Поток th2 заканчивает выполнение делегата Update. th1 сравнивает val1 = th2_v (Через equils).
9 + Значение равны и th2 сохраняет результат.
10 +4) Поток th1 заканчивает выполнение делегата Update. th2 сравнивает val1 = th1_v (Через equils).
11 + Значение НЕ равны и th2 повторно вызывает Update делегат.
12 + (Если элемент был удален, то запустить делегат Add)
13 + !Повторного вызова делегата не произойдет, в случает если результат работы th2 эквивалентен исходному начальному значению val1.
13 13  
14 -Получается, что ни вызов AddOrUpdate, ни вызов конкретного делегата (Add/Update) сам по себе не блокирует значение в коллекции и не препятствует в изменении другим потокам.
15 +Получается, что ни вызов AddOrUpdate, ни вызов конкретного делегата (Add/Update) сам по себе не блокирует значение в коллекции и не препятствует в изменении другими потокам.
15 15  
16 -По сути мы получаем **оптимистичную блокировку**. В случае неудачи которой, повторно вызывается действие обработки (add/update) в нового значения по указанному ключу. Критерием сравнения блокировки является Equils. В таком случае возможно имеет смысл перегрузка Equils и наличии в сущности некоторого ключевого поля. Нечто вроде Change Version TimeStamp.
17 -
18 -
19 -Ссылки:
20 -[[Базы данных/Транзакции и блокировки>>https://wiki.denhome.ru/bin/view/Разработка/Базы%20данных/Транзакции%20и%20блокировки/]]
17 +По сути мы получаем **оптимистичную блокировку**. В случае неудачи которой, повторно вызывается действие обработки (add/update) для измененного значения по указанному ключу.
18 +Критерием сравнения блокировки является Equils. В таком случае возможно имеет смысл перегрузка Equils и наличии в сущности некоторого ключевого поля. Нечто вроде Change Version TimeStamp.