我无法理解在我的代码中使用 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/