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

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

От версии < 3.1 >
отредактировано Alexandr Fokin
на 2020/06/13 20:43
К версии 1.1 >
отредактировано Alexandr Fokin
на 2020/06/13 20:36
>
Изменить комментарий: К данной версии нет комментариев

Комментарий

Подробности

Свойства страницы
Содержимое
... ... @@ -4,13 +4,10 @@
4 4  
5 5  1 Поток th1 запускает Update делегат по ключу key1. (Фиксирует текущее значение th1_v)
6 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.
7 +3 Поток th2 заканчивает выполнение делегата Update. th1 сравнивает val1 = th2_v (Через equils). Значение равны и th2 сохраняет результат.
8 +4 Поток th1 заканчивает выполнение делегата Update. th2 сравнивает val1 = th1_v (Через equils). Значение НЕ равны и th2 повторно вызывает Update делегат.
9 +(Если элемент был удален, то запустить делегат Add)
10 +!Повторного вызова делегата не произойдет, в случает если результат работы th2 эквивалентен исходному начальному знаечнию val1.
13 13  
14 14  Получается, что ни вызов AddOrUpdate, ни вызов конкретного делегата (Add/Update) сам по себе не блокирует значение в коллекции и не препятствует в изменении другим потокам.
15 15  
16 -По сути мы полчуем потимистичную блокировку. В случае неудачи которой, повторно вызывается действие обработки. Критерием блокировки является Equils. В таком случае возможно имеет смысл перегрузка Equils и наличии в сущности некоторого ключевого поля. Нечто вроде Change TimeStamp.