Еще одно замечание:
// This might fail if another thread is adding with key value of 1.
cd.TryAdd(1, "one");
Этот комментарий неверен и, возможно, страдает от того же неправильного представления о том, что значит «попробовать». Речь идет не о одновременной попытке добавления, а о том, было ли добавлено значение с ключом 1
.
Рассмотрим стандарт Dictionary<TKey,TValue>
. Эквивалентный код будет:
if (!d.Contains(1))
d.Add(1, "one");
Это требует двух операций. Невозможно спроектировать такой API для обеспечения безопасности потоков, так как cd
может иметь значение с ключом 1
, добавленным между вызовами к Contains
и Add
, что приведет к Add
throw. *
Параллельные коллекции имеют API-интерфейсы, которые логически объединяют эти пары test-and-do в единичные атомарные операции за единым API.