【发布时间】:2018-09-27 19:02:18
【问题描述】:
我需要准确理解 .NET 的 Dictionary 集合的锁定和并发问题——而不是 ConcurrentDictionary。假设我有一个字典定义为 key=string, value=SomeOtherRandomClass。
在调用 TryGetValue("abc") 期间是否必须对整个字典进行写锁定?
如果可以保证在调用 TryGetValue 期间不会添加/删除任何键 - 是否仍需要对整个字典进行写锁定?
如果成功调用 TryGetValue,是否必须在修改相应值 (SomeOtherClass) 时锁定整个字典?或者只是那个特定的键,这样两个人就不能同时更新同一个(SomeOtherClass)。
我认为最合乎逻辑的答案是对#3 是、否,然后是否和是。但我想绝对确定。但我可以想象#1 的答案是否定的实现。
【问题讨论】:
-
最简单的解决方案是使用
ConcurrentDictionary。使用它而不是试图重新发明轮子,你有什么具体问题? 1) 是的。 2) 不,但您保证这种情况的方式是锁定整个字典(参见 1)。 3) 这有点取决于您要做什么,实际上是ConcurrencyDictionary无法帮助您的事情。 -
我认为是的,不,不,但是。在并发环境中,几乎所有查找都必须对整个字典进行写锁定(但可能会发生多个并发查找),并且对任何写操作都必须进行读/写锁定。一旦您从字典中取出对象,为了对该对象进行更改,您只需要锁定对该特定对象的访问,尽管另一个线程可以替换该键并将其从字典中完全删除。但是,API 无法保证这些。使用 ConcurrentDictionary 是确保您安全的唯一方法。
-
您是否阅读了该类型的文档中关于如何从多个线程访问和不能访问它的内容?它专门回答了所有这些问题。
-
我同意@MattBurland。如果您要问这些问题,您应该使用
ConcurrentDictionary。
标签: c# dictionary