我需要锁定并发字典的 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;
}
});
非常感谢大家。
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
。
在我的 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;
}
});
非常感谢大家。
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
。