Похоже, что и AddOrUpdate
, и TryUpdate
будут работать.
редактировать
Я вполне могу ошибаться. Если это так, я не думаю, что документация достаточно ясна, поэтому давайте просто посмотрим на код. Предоставлено отражателем:
public TValue AddOrUpdate(TKey key, Func<TKey, TValue> addValueFactory, Func<TKey, TValue, TValue> updateValueFactory)
{
TValue local;
TValue local3;
if (key == null)
{
throw new ArgumentNullException("key");
}
if (addValueFactory == null)
{
throw new ArgumentNullException("addValueFactory");
}
if (updateValueFactory == null)
{
throw new ArgumentNullException("updateValueFactory");
}
do
{
if (!this.TryGetValue(key, out local3))
{
TValue local2;
local = addValueFactory(key);
if (!this.TryAddInternal(key, local, false, true, out local2))
{
continue;
}
return local2;
}
local = updateValueFactory(key, local3);
}
while (!this.TryUpdate(key, local, local3));
return local;
}
Теперь, если фабрика обновлений взяла существующий список и возвратила новый с дополнительным элементом, мне действительно кажется, что он будет атомарным. В случае состояния гонки проигравшему просто будет снова вызвана их фабрика обновлений. Я ошибаюсь?