我认为这是并发字典的正确用法,对吗

private ConcurrentDictionary<int,long> myDic = new ConcurrentDictionary<int,long>();

//Main thread at program startup

for(int i = 0; i < 4; i++)
{
  myDic.Add(i, 0);
}

//Separate threads use this to update a value

myDic[InputID] = newLongValue;

我没有锁等,只是更新字典中的值,即使多个线程可能会try 做同样的事情.

推荐答案

这取决于你所说的线程安全.

从MSDN-How to: Add and Remove Items from a ConcurrentDictionary:

ConcurrentDictionary<TKey, TValue>是为多线程场景设计的.您不必在代码中使用锁来添加或删除集合中的项目.然而,一个线程总是可以检索一个值,而另一个线程通过给同一个键一个新值来立即更新集合.

因此,可能会得到字典中某项值的不一致的view.

.net相关问答推荐

仅在有换行符时捕获分隔符之间的所有文本

C#/.NET + VisualStudio,命名空间问题

使用 Task.WhenAll 但需要跟踪每个单独的 Task 的成功

如何为多种文件类型设置 FileSystemWatcher 过滤器?

如何在 ASP.NET Core 中使用 Bootstrap 4

奇数返回语法语句

如何在 C# 7 中返回多个值?

等效于 C# 在 powershell 中的“使用”关键字?

什么是 project.lock.json?

InvalidOperationException:无法解析类型“Microsoft.AspNetCore.Http.IHttpContextAccessor”的服务

ASP.NET Core 等效于 ASP.NET MVC 5 的 HttpException

多行 C# 插值字符串文字

nameof 的目的是什么?

将 C# 编译为本机?

[DllImport("QCall")] 是什么?

添加对 MEF 插件项目的引用时,为什么会出现警告图标?

EnsureSuccessStatusCode 的使用和它抛出的 HttpRequestException 的处理

如何从控制台应用程序中的 Task.WaitAll() 获取返回值?

如何找到特定 dll 的 PublicKeyToken?

程序集引用的“特定版本”属性在 Visual Studio 中究竟是如何工作的?