字典查找需要锁定吗?

Dar*_*der 12 c# lookup multithreading dictionary locking

lock(dictionaryX)
{
   dictionaryX.TryGetValue(key, out value);
}
Run Code Online (Sandbox Code Playgroud)

在查找字典时是否需要锁定?

程序是多线程的,并且在向dict添加键/值时.dict被锁定了.

Kam*_*yar 12

如前所述这里:

使用TryGetValue()而不锁定是不安全的.字典暂时处于使其不适合读取而另一个线程正在编写字典的状态.随着包含的条目数量的增加,字典将不时重新组织.当您在重新组织发生的确切时间进行读取时,在存储桶更新但尚未输入值时,您将面临发现密钥错误值的风险.

更新:看一下本页的 "线程安全"部分.

  • OP明确提到此操作发生在多线程环境中. (4认同)
  • 我同意。但是问题作者的意思是在多线程环境中使用锁。 (2认同)

Jar*_*Par 2

仅当您在线程之间同步对资源的访问时才需要锁定。只要不涉及多线程,那么这里就不需要锁定。

在从多个线程更新和读取值的上下文中,锁是绝对必要的。事实上,如果您使用 4.0,您应该考虑切换到专门为并发访问设计的集合之一。

  • @user177883:锁定需要读者和作者的合作。如果读取器没有锁定,那么就好像写入器根本没有进行任何锁定。“锁定”仅意味着获取互斥体的所有权,它不会停止不尝试获取互斥体的代码的执行。 (3认同)