我需要锁定并发字典的 AddOrUpdate 吗?

Do I need a lock in AddOrUpdate of a concurrent dictionary?

在我的 class 我有

public static ConcurrentDictionary<string, HashSet<string>> ConnectedUserConnections = new ConcurrentDictionary<string, HashSet<string>>();

添加或更新时,我应该通过以下方式更新:

ConnectedUserConnections.AddOrUpdate(userId, new HashSet<string>(), (key, existingVal) =>
                {
                    existingVal.Add(connectionId);
                    return existingVal;
                });

ConnectedUserConnections.AddOrUpdate(userId, new HashSet<string>(), (key, existingVal) =>
                {
                   lock(ConnectedUserConnections)

                    {
                        existingVal.Add(connectionId);
                        return existingVal;
                    }
                });

非常感谢大家。

通过查看参考源中的 public TValue AddOrUpdate(TKey key, Func<TKey, TValue> addValueFactory, Func<TKey, TValue, TValue> updateValueFactory)

 while (true)
 {
     TValue oldValue;
     if (TryGetValue(key, out oldValue))
     //key exists, try to update
     {
         newValue = updateValueFactory(key, oldValue);
         if (TryUpdate(key, newValue, oldValue))

TryGetValue之前没有锁,所以如果key已经有一个值,多个线程可以到达TryGetValue,执行它,return true,同时执行updateValueFactory(你的方法)并尝试添加existingVal.Add(connectionId);...

所以是的,您确实需要 lock