Изменения документа ConcurrentDictionary
Редактировал(а) Alexandr Fokin 2023/02/16 01:41
отредактировано Alexandr Fokin
на 2020/06/13 20:36
на 2020/06/13 20:36
отредактировано Alexandr Fokin
на 2020/06/13 20:44
на 2020/06/13 20:44
Изменить комментарий:
К данной версии нет комментариев
Комментарий
-
Свойства страницы (1 изменено, 0 добавлено, 0 удалено)
Подробности
- Свойства страницы
-
- Содержимое
-
... ... @@ -4,10 +4,13 @@ 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). Значение равны и th2 сохраняет результат. 8 -4 Поток th1 заканчивает выполнение делегата Update. th2 сравнивает val1 = th1_v (Через equils). Значение НЕ равны и th2 повторно вызывает Update делегат. 9 -(Если элемент был удален, то запустить делегат Add) 10 -!Повторного вызова делегата не произойдет, в случает если результат работы th2 эквивалентен исходному начальному знаечнию val1. 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. 11 11 12 12 Получается, что ни вызов AddOrUpdate, ни вызов конкретного делегата (Add/Update) сам по себе не блокирует значение в коллекции и не препятствует в изменении другим потокам. 13 13 16 +По сути мы полчучаем оптимистичную блокировку. В случае неудачи которой, повторно вызывается действие обработки. Критерием сравнения блокировки является Equils. В таком случае возможно имеет смысл перегрузка Equils и наличии в сущности некоторого ключевого поля. Нечто вроде Change TimeStamp.