Изменения документа ConcurrentDictionary
Редактировал(а) Alexandr Fokin 2023/02/16 01:41
<
отредактировано Alexandr Fokin
на 2022/01/03 15:31
на 2022/01/03 15:31
отредактировано Alexandr Fokin
на 2023/02/16 01:41
на 2023/02/16 01:41
Изменить комментарий:
К данной версии нет комментариев
Комментарий
-
Свойства страницы (2 изменено, 0 добавлено, 0 удалено)
Подробности
- Свойства страницы
-
- Родительский документ
-
... ... @@ -1,1 +1,1 @@ 1 -Разработка.NET.C#.Коллекции.Concurrent.WebHome 1 +Разработка.NET.C#.Коллекции.System\. Collections\. Concurrent.WebHome - Содержимое
-
... ... @@ -1,18 +1,45 @@ 1 - 1 +Best Practices for Using ConcurrentDictionary | Лучшие практики использования ConcurrentDictionary 2 +[[https:~~/~~/arbel.net/2013/02/03/best-practices-for-using-concurrentdictionary/>>url:https://arbel.net/2013/02/03/best-practices-for-using-concurrentdictionary/]] 2 2 3 - **Описаниеработыметода AddOrUpdate**:4 - Вdictionaryесть одно значение по ключуkey1l1.4 +How to improve performance of ConcurrentDictionary.Count in C# 5 +[[https:~~/~~/stackoverflow.com/questions/41298156/how-to-improve-performance-of-concurrentdictionary-count-in-c-sharp>>url:https://stackoverflow.com/questions/41298156/how-to-improve-performance-of-concurrentdictionary-count-in-c-sharp]] 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 - Значение равны и th2 сохраняет результат. 10 -4) Поток th1 заканчивает выполнение делегата Update. th2 сравнивает val1 = th1_v (Через equils). 11 - Значение НЕ равны и th2 повторно вызывает Update делегат. 12 - (Если элемент был удален, то запустить делегат Add) 13 - !Повторного вызова делегата не произойдет, в случает если результат работы th2 эквивалентен исходному начальному значению val1. 7 +//Дополнение: В некоторых случаях может иметь смысл создание собственной обертки над коллекции и ведения в ней собственного счетчика размера. 8 +Контроль интерфейса обертки позволит четко отслеживать события Добавления/Удаления, для управления счетчиком можно использовать [[Interlocked>>doc:Разработка.NET.C#.Многопоточность и асинхронность.Примитивы синхронизации.WebHome]] операции.// 14 14 15 -Получается, что ни вызов AddOrUpdate, ни вызов конкретного делегата (Add/Update) сам по себе не блокирует значение в коллекции и не препятствует в изменении другими потокам. 10 +Concurrency структуры в .net. ConcurrentDictionary изнутри 11 +[[https:~~/~~/habr.com/ru/post/245727/>>https://habr.com/ru/post/245727/]] 16 16 17 -По сути мы получаем **оптимистичную блокировку**. В случае неудачи которой, повторно вызывается действие обработки (add/update) для измененного значения по указанному ключу. 18 -Критерием сравнения блокировки является Equils. В таком случае возможно имеет смысл перегрузка Equils и наличии в сущности некоторого ключевого поля. Нечто вроде Change Version TimeStamp. 13 +Под капотом у Dictionary и ConcurrentDictionary 14 +[[https:~~/~~/habr.com/ru/post/198104/>>https://habr.com/ru/post/198104/]] 15 + 16 +[[Dictionary>>Разработка.NET.C#.Коллекции.System\. Collections\. Generic.Dictionary.WebHome]] 17 + 18 +---- 19 + 20 +DotNext | Антон Нечуговских — Как мы написали свой lock-free dictionary 21 +[[https:~~/~~/www.youtube.com/watch?v=Vs7qp8FNURo>>https://www.youtube.com/watch?v=Vs7qp8FNURo]] 22 + 23 +---- 24 + 25 +==== Внутренние ссылки: ==== 26 + 27 +====== Дочерние страницы: ====== 28 + 29 +{{children/}} 30 + 31 +====== Обратные ссылки: ====== 32 + 33 +{{velocity}} 34 +#set ($links = $doc.getBacklinks()) 35 +#if ($links.size() > 0) 36 + #foreach ($docname in $links) 37 + #set ($rdoc = $xwiki.getDocument($docname).getTranslatedDocument()) 38 + * [[$escapetool.xml($rdoc.fullName)]] 39 + #end 40 +#else 41 + No back links for this page! 42 +#end 43 +{{/velocity}} 44 + 45 +----