Для чего используется ConcurrentDictionary в C#?

«Для чего используется ConcurrentDictionary в C#?» — вопрос из категории Многопоточность, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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> для лучшей производительности.
  • Для операций, требующих атомарности над несколькими ключами — для этого потребуется внешняя синхронизация.