何时在并发中使用锁定语句

时间:2012-08-30 20:21:45

标签: c# asp.net concurrency

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

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

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

4 个答案:

答案 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,是的,您需要在ReadWriteContains上自行实施锁定机制,模拟基本ACID原则,如

  • Consistensy
  • Isoltaion
  • 耐久性。

在这种情况下,不要认为 Atomicity 有很多交易。

希望这有帮助。

答案 3 :(得分:0)

您可以使用ConcurrentDictionary

LIink:http://msdn.microsoft.com/en-us/library/dd287191.aspx