Параллельные коллекции
CSharpCooking.NET предлагает коллекции, безопасные в отношении потоков, которые определены в пространстве имен System.Collections.Concurrent: ConcurrentStack, ConcurrentQueue, ConcurrentBag, ConcurrentDictionary.

Параллельные коллекции оптимизированы для сценариев с высокой степенью параллелизма; тем не менее, они также могут быть полезны в ситуациях, когда требуется коллекция, безопасная к потокам (в качестве альтернативы применению блокировки к обычной коллекции). Однако есть несколько предостережений.
• По производительности традиционные коллекции превосходят параллельные коллекции во всех сценариях кроме тех, которые характеризуются высокой степенью параллелизма. Например, ConcurrentDictionary пытается избежать операций с блокировками, но это приводит к сложной внутренней логике, что неизбежно отражается на скорости работы программы при однопоточном доступе.
• Безопасная к потокам коллекция вовсе не гарантирует, что код, в котором она используется, будет безопасным в отношении потоков. Рассмотрим пример. Одновременное добавление или удаление элементов из разных потоков будет корректно работать на уровне потокобезопасного списка. Но если ваша программа зависит от определенного порядка этих операций, то вам потребуется дополнительная синхронизация на уровне программы.
• Если вы производите перечисление параллельной коллекции, в то время как другой поток ее модифицирует, то никаких исключений не возникает – взамен вы получите смесь старого и нового содержимого.
• Параллельные классы стеков, очередей и пакетов внутренне реализованы с помощью связных списков. Это делает их менее эффективными в плане потребления памяти, чем непараллельные классы Stack и Queue, но лучшими для параллельного доступа, т.к. связные списки способствуют построению реализаций с низкой блокировкой или вообще без таковой. (Причина в том, что вставка узла в связный список требует обновления лишь пары ссылок, тогда как вставка элемента в коллекции типа List может привести к перемещению тысяч существующих элементов.)
#dotNET #ConcurrentCollections #Multithreading #SystemCollections #ConcurrentStack #ConcurrentQueue #ConcurrentBag #ConcurrentDictionary #ParallelProgramming #ThreadSafety #PerformanceMatters #ProgrammingTips #Synchronization #DataStructures #LinkedLists #CodeOptimization #TechInsights #SoftwareDevelopment #ProgrammingKnowledge #MemoryEfficiency #ModernCoding