Изменения документа ConcurrentDictionary
                  Редактировал(а) Alexandr Fokin 2023/02/16 01:41
              
      
      От версии  2.1 
    
    
              отредактировано Alexandr Fokin
        
на 2020/06/13 20:37
     на 2020/06/13 20:37
      Изменить комментарий:
              К данной версии нет комментариев
          
         
      К версии  11.1 
    
    
              отредактировано Alexandr Fokin
        
на 2022/01/03 15:31
     на 2022/01/03 15:31
      Изменить комментарий:
              К данной версии нет комментариев
          
         Сводка
- 
          Свойства страницы (3 изменено, 0 добавлено, 0 удалено)
Подробности
- Свойства страницы
- 
      - Родительский документ
-   ... ... @@ -1,1 +1,1 @@ 1 -Разработка.NET.C#.WebHome 1 +Разработка.NET.C#.Коллекции.Concurrent.WebHome 
- Теги
-   ... ... @@ -1,0 +1,1 @@ 1 +keyValue|dictionary|threadSafe 
- Содержимое
-   ... ... @@ -1,15 +1,18 @@ 1 + 1 1 2 - ПримерработыConcurrentDictionaryAddOrUpdate: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 17 +По сути мы получаем **оптимистичную блокировку**. В случае неудачи которой, повторно вызывается действие обработки (add/update) для измененного значения по указанному ключу. 18 +Критерием сравнения блокировки является Equils. В таком случае возможно имеет смысл перегрузка Equils и наличии в сущности некоторого ключевого поля. Нечто вроде Change Version TimeStamp. 
 
