我对词典的使用是否需要锁定

本文关键字:是否 锁定 | 更新日期: 2023-09-27 18:37:24

许多线程可以访问summary .每个线程都有一个用于访问字典的唯一键;

Dictionary<string, List<Result>> summary;

后续操作是否需要锁定?

  1. summary[key] = new List<Result>()
  2. summary[key].Add(new Result());

似乎我不需要锁定,因为每个线程都会使用不同的键访问字典,但是 (1) 不会因为与其他踏板并发新记录添加到字典中而出现问题?

我对词典的使用是否需要锁定

是的,您需要使用锁定。

字典对于添加操作不是线程安全的。如果您使用的是 .NET 4,则可以考虑切换到 ConcurrentDictionary。否则,应创建自己的线程安全集合(例如此集合)。

考虑使用 ReaderWriterLockSlim 来同步对集合的访问(以防您不使用 ConcurrentDictionary)。

必须锁定对字典的所有写入访问权限。不能保证访问不同的密钥是线程安全的,事实上,事实并非如此。

从 MSDN:

一个词典可以同时支持多个读取器,只要集合不被修改。即便如此,通过集合进行枚举本质上也不是线程安全的过程。在极少数情况下,枚举与写入访问争用,则必须在整个枚举期间锁定集合。若要允许多个线程访问集合以进行读取和写入,必须实现自己的同步。

默认情况下,字典不是线程安全的。你要添加什么并不重要。最重要的是:您无法控制来自不同线程的并发添加。所以你肯定需要锁。或者切换到线程安全集合(即 CocnurrentDictionary for .NET 4+)