我无法理解在代码中使用lock()
语句的方法。我有几个这样的静态集合:
private static Dictionary<string, User>() Users = new Dictionary<string, User>();
我经常添加,删除,更新和阅读此集合。我意识到当我添加,删除或更新时我应该锁定Users
,但是当我从集合中读取时我是否必须锁定它?执行诸如搜索键并返回词典中的User
之类的正确方法是什么?我正在考虑创建一个新的Dictionary
实例,然后将用户复制到该实例然后从中读取,或者我可以直接从中读取它吗?
答案 0 :(得分:4)
此处的最佳选择可能是删除锁定,并使用ConcurrentDictionary<string, User>
而不是Dictionary<string, User>
。
否则,您还需要同步读取。您可以从多个线程中读取,但如果读者在阅读时写入字典,则需要同步。 ReaderWriterLock
(或ReaderWriterLockSlim
)在这种情况下运行良好,因为它们可以允许多个读者,但只允许一个作者。简单的lock
也可以使用,但会比需要更频繁地阻止。
答案 1 :(得分:3)
但是当我从集合中读取时,我是否必须锁定它?
是的,如果另一个线程可能在读取期间修改字典。
执行搜索键并在字典中返回用户的正确方法是什么?
使用TryGetValue方法。
如果您使用的是.Net 4.0或更高版本,则可以使用线程安全的ConcurrentDictionary集合。
答案 2 :(得分:2)
如果您使用C# 4.0
或更多,则可以使用处理所有内容的ConcurentDictionary。
如果由于某种原因您没有或不能使用4.0
,是的,您需要在Read
,Write
和Contains
上自行实施锁定机制,模拟基本ACID原则,如
在这种情况下,不要认为 Atomicity 有很多交易。
希望这有帮助。
答案 3 :(得分:0)
您可以使用ConcurrentDictionary