Pull to refresh

Comments 6

Расстраивает то, что в методе GetOrAdd(key, valueFactory) переданная функция valueFactory может выполниться в разных потоках для одного и того же ключа. Хотелось бы блокировки по ключу.
Есть такой метод
TValue GetOrAdd(TKey key, TValue value)
он является атомарной операцией.
Знаю. Просто для реализации, например, кеша требуется передавать не готовое значение, а фабрику.
Но тогда надо иметь ввиду, что фабрика может быть вызвана больше 1 раза для одного ключа (из разных потоках, конечно) —
TValue resultingValue;
if (TryGetValue(key, out resultingValue))
    return resultingValue;
TryAddInternal(key, valueFactory(key), false, true, out resultingValue);
«Отсюда и получается скорость доступа — O(1)» Строго говоря, тут не будет точного О(1), но очень близко. Все зависит от качества хеш-функции типа-аргумента.
Конечно, зависит. O(1) — это в среднем. Например, при хеш функции hash(item)=const для любого item — будет O(n).
Sign up to leave a comment.

Articles