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