我无法理解在我的代码中使用 lock() 语句的方式。我有几个像这样的静态集合:

private static Dictionary<string, User>() Users = new Dictionary<string, User>();

我不断地添加、删除、更新和阅读这个集合。我意识到当我添加、删除或更新时,我应该锁定 Users ,但是当我从集合中读取时,我必须锁定它吗?执行诸如搜索键并在字典中返回 User 之类的操作的正确方法是什么?我正在考虑创建一个新的 Dictionary 实例,然后将 Users 复制到该实例然后从中读取,或者我可以直接从中读取吗?

最佳答案

这里最好的选择可能是移除锁,并使用 ConcurrentDictionary<string, User> 而不是 Dictionary<string, User>

否则,您还需要同步读取。您可以从多个线程读取,但是如果在读者阅读时写入者将写入字典,则需要同步。 ReaderWriterLock (或 ReaderWriterLockSlim )在这种情况下工作得很好,因为它们可以允许多个读取器,但只允许一个写入器。一个简单的 lock 也可以工作,但会比需要的更频繁地阻塞。

关于c# - 何时在并发中使用 lock 语句,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12204866/

10-11 04:06
查看更多