提问者:小点点

我应该什么时候使用ConcurrentDictionary和Dictionary?


我总是不知道该选哪一个。在我看来,如果我想要两种数据类型作为键和值,我会使用字典,而不是列表,这样我就可以很容易地通过找到一个值,但我总是不知道我应该使用并发字典还是字典

在你指责我没有对此做太多研究之前,我已经试过了,但谷歌似乎在DictionaryvsConcurrentDictionary上没有任何东西,但在每一个方面都有自己的东西。

我以前问过一个朋友这个问题,但他们只是说:“如果你在代码中经常使用字典,就使用并发字典”,我真的不想缠着他们更详细地解释它。有人能详细解释一下吗?


共3个答案

匿名用户

“如果你经常在代码中使用字典,就使用ConcurrentDictionary”是一种含糊不清的建议。我不怪你搞混了。

在从多个线程(或异步任务)更新字典的环境中使用。你可以使用一个标准的字典从尽可能多的代码,如果它来自一个线程;)

如果你看一下并发字典上的方法,你会发现一些有趣的方法,比如TryAddTryGetValueTryUpdateTryRemove

例如,考虑一个典型的模式,您可以看到使用正常的<代码>字典<代码>类。

// There are better ways to do this... but we need an example ;)
if (!dictionary.ContainsKey(id))
    dictionary.Add(id, value);

这有一个问题,在检查它是否包含键和调用Add之间,不同的线程可以使用相同的id调用Add。当这个线程调用Add时,它将抛出一个异常。方法TryAdd为您处理该问题,并将返回一个true/false,告诉您是否添加了该键(或者该键是否已在字典中)。

因此,除非您使用的是多线程代码部分,否则您可能只需要使用标准的字典类。也就是说,从理论上讲,您可以使用锁来防止并发访问字典;这个问题已经在“字典锁定与ConcurrentDictionary”中讨论过了。

匿名用户

在正常的字典之上使用Con电流字典的最大原因是线程安全。如果您的应用程序将获得多个线程同时使用相同的字典,则需要线程安全的Con电流字典,当这些线程写入或构建字典时尤其如此。

在没有多线程的情况下使用ConcurrentDictionary的缺点是开销。所有那些允许线程安全的函数仍然存在,所有的锁和检查仍然会发生,占用处理时间并使用额外的内存。

匿名用户

当您需要跨多个线程(即多线程)访问字典时,ConcurrentDictionary非常有用。VanillaDictionary对象不具备此功能,因此只能以单线程方式使用。