Как MSDN говорит
ConcurrentDictionary<TKey, TValue>
Класс Представляет потокобезопасную коллекцию пар ключ-значение, к которым одновременно можно обращаться несколькими потоками.
Но, как я знаю, классы System.Collections.Concurrent
предназначены для PLINQ.
У меня есть Dictionary<Key,Value>
, который держит он-лайн клиентов на сервере, и я делаю его потокобезопасным, блокируя объект, когда у меня есть к нему доступ.
Могу ли я безопасно заменить Dictionary<TKey,TValue>
на ConcurrentDictionary<TKey,TValue>
в моем случае? увеличится ли производительность после замены?
Здесь в части 5 Джозеф Альбахари упомянул, что он предназначен для параллельного программирования
- Совпадающие коллекции настраиваются для параллельного программирования. Обычные коллекции превосходят их во всех, но очень параллельных сценариях.
- Нитебезопасная коллекция не гарантирует, что использующий ее код будет потокобезопасным.
- Если вы перечисляете параллельную коллекцию, а другой поток ее модифицирует, исключение не генерируется. Вместо этого вы получаете смесь старого и нового контента.
- Отсутствует параллельная версия списка.
- Сопутствующие классы стека, очереди и пакета реализуются внутри со связанными списками. Это делает их менее эффективными с точки зрения памяти, чем неконкурентные классы Stack и Queue, но лучше для одновременного доступа, поскольку связанные списки способствуют реализации без блокировки или с низкой блокировкой. (Это связано с тем, что вставка node в связанный список требует обновления только нескольких ссылок, в то время как вставка элемента в структуру, подобную List, может потребовать перемещения тысяч существующих элементов.)