Ответ 1
Да, это потокобезопасность, и да, это позволяет избежать использования блокировок повсюду (что бы это ни значило). Конечно, это обеспечит вам поточный безопасный доступ к данным, хранящимся в этом словаре, но если сами данные не являются потокобезопасными, вам необходимо, конечно, синхронизировать с ним доступ. Представьте, например, что вы сохранили в этом кеше a List<T>
. Теперь thread1 извлекает этот список (в потоковом режиме, так как параллельный словарь гарантирует вам это), а затем начинает перечислить этот список. Точно так же thread2 извлекает этот же список из кеша (в потокобезопасной манере, поскольку параллельный словарь гарантирует вам это) и записывает в список (например, он добавляет значение). Вывод: если вы не синхронизировали thread1, он попадет в неприятности.
Что касается использования его в качестве кэша, то это, вероятно, не очень хорошая идея. Для кэширования я бы порекомендовал вам то, что уже встроено в структуру. Например, такие классы, как MemoryCache. Причиной этого является то, что встроенная в System.Runtime.Caching
сборка, явная конструкция для кэширования = > она обрабатывает такие вещи, как автоматическое истечение данных, если вы начинаете работающие на низком уровне памяти, обратные вызовы для элементов истечения срока действия кеша, и вы даже сможете распределять кеш на нескольких серверах с помощью таких вещей, как memcached, AppFabric,..., все, чего вы не могли бы мечтать с помощью параллельного словаря.