【问题标题】:Do I have to apply lock even though accessing concurrent dictionary即使访问并发字典我也必须应用锁吗
【发布时间】:2017-01-12 07:26:46
【问题描述】:

我在 web api 中使用了一个静态并发字典,它可以跨用户访问。

我正在使用以下方法:这些方法都是线程安全的吗?还是我必须添加lock(),即使它是ConccurentDictionary

基本上,它是由整个用户访问的,然后它应该能够相应地工作,因为这个字典包含每个用户的集合并且它依赖于它。

static ConcurrentDictionary<string, SApp> SAppFarm= new ConcurrentDictionary<string, SApp>();    

.TryRemove(_sessionUser,out s);
.TryAdd(_sessionUser, r);
.GetOrAdd(sessionUser, application);

【问题讨论】:

  • msdn.microsoft.com/en-us/library/… 所以不,你提到的方法不需要锁定
  • 来自 MSDN:表示可由多个线程同时访问的键/值对的线程安全集合。
  • 是的,它的线程安全,我通过 msdn 但是,不确定所有方法都支持它。对于我的情况,每个线程只有一个键访问,然后在同一个线程中添加/更新它的值我想即使改变操作也没什么好担心的。每个键用于单独的用户请求线程。并且每个用户都为该键的对象工作以进行添加/编辑操作。

标签: c# asp.net multithreading asp.net-web-api concurrentdictionary


【解决方案1】:

ConcurrentDictionary 是否记录在案 here 是线程安全的。这包括TryRemoveTryAddGetOrAdd 方法。

因此不需要锁定。请记住,线程安全与有关。如果您在不同线程中为给定键更改相同的值对象,则必须注意此更改操作的线程安全性。

【讨论】:

  • 好的,所以,就我而言,每个线程只能访问一个键并在同一线程中添加/更新其值,然后我想即使更改操作也无需担心。每个键用于单独的用户请求线程。并且每个用户都为该键的对象工作以进行添加/编辑操作。没错吧?
  • 对,你只需要考虑同一个用户(同一个key)有两个或多个并发请求(多个线程)同时改变同一个值对象的情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多