Расстраивает то, что в методе GetOrAdd(key, valueFactory) переданная функция valueFactory может выполниться в разных потоках для одного и того же ключа. Хотелось бы блокировки по ключу.
Но тогда надо иметь ввиду, что фабрика может быть вызвана больше 1 раза для одного ключа (из разных потоках, конечно) —
TValue resultingValue;
if (TryGetValue(key, out resultingValue))
return resultingValue;
TryAddInternal(key, valueFactory(key), false, true, out resultingValue);
«Отсюда и получается скорость доступа — O(1)» Строго говоря, тут не будет точного О(1), но очень близко. Все зависит от качества хеш-функции типа-аргумента.
Concurrency структуры в .net. ConcurrentDictionary изнутри