Ответ
ConcurrentDictionary<TKey, TValue> — это потокобезопасная реализация словаря из пространства имен System.Collections.Concurrent. Она предназначена для сценариев, где к коллекции обращаются из нескольких потоков одновременно, и позволяет избежать явных блокировок (lock) для большинства операций, что повышает производительность.
Ключевые особенности и методы:
- Атомарные операции: Методы
AddOrUpdate,GetOrAdd,TryAdd,TryUpdateиTryRemoveгарантируют потокобезопасность. - Оптимизация для чтения: Обеспечивает высокую производительность при частых операциях чтения.
- Слабая согласованность: Итераторы и некоторые операции (например,
Count) могут отражать не полностью согласованное состояние словаря в момент многопоточных изменений.
Пример использования:
using System.Collections.Concurrent;
// Создание потокобезопасного кэша
var cache = new ConcurrentDictionary<string, Data>();
// Потокобезопасное добавление или обновление значения
var data = cache.AddOrUpdate(
key: "user_123",
addValueFactory: (key) => FetchDataFromDb(key), // Вызывается, если ключа нет
updateValueFactory: (key, oldValue) => UpdateData(oldValue) // Вызывается, если ключ есть
);
// Потокобезопасное получение или добавление значения
var cachedItem = cache.GetOrAdd("config", FetchConfiguration);
Когда использовать:
- Многопоточный доступ к общему словарю (например, кэш в веб-приложении).
- Сценарии с высокой конкуренцией на чтение.
- Когда нужно избежать блокировок всей коллекции для повышения масштабируемости.
Когда НЕ использовать:
- Если доступ к коллекции осуществляется только из одного потока — используйте обычный
Dictionary<TKey, TValue>для лучшей производительности. - Для операций, требующих атомарности над несколькими ключами — для этого потребуется внешняя синхронизация.