Из раздела «Примечания» на этой странице https://msdn.microsoft.com/en-us/librar ... .110).aspx. . там написано
"Однако делегаты для этих методов вызываются вне блокировок, чтобы избежать проблем, которые могут возникнуть от выполнения неизвестного кода при блокировке. Следовательно, код, выполняемый этими делегатами, не подчиняется атомарности операции».
Поэтому я не уверен, что это потокобезопасно. У меня есть один случай: если ключ не найден, значение равно 1, иначе увеличьте значение на 1.
Я написал ниже функцию
Код: Выделить всё
private static void AddOrUpdate(ConcurrentDictionary map)
{
Random r = new Random();
Thread.Sleep(r.Next(10));
map.AddOrUpdate(Key, 1, (key, value) => value + 1);
}
public static void TestThreadSafe(ConcurrentDictionary map)
{
Thread[] threads = new Thread[Size];
for (int i = 0; i < Size; ++i)
{
threads[i] = new Thread(() => AddOrUpdate(map));
}
foreach (var thread in threads)
{
thread.Start();
}
}
Является ли метод, описанный выше, потокобезопасным? Когда AddOrUpdate не является потокобезопасным?
Подробнее здесь: https://stackoverflow.com/questions/391 ... dictionary