4

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

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

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

4

4 回答 4

4

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

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

于 2012-08-30T20:24:09.863 回答
3

但是当我从集合中阅读时,我必须锁定它吗?

是的,如果另一个线程可能在读取期间修改字典。

执行诸如搜索键并在字典中返回用户之类的正确方法是什么?

使用TryGetValue方法。

如果您使用的是 .Net 4.0 或更高版本,则可以使用ConcurrentDictionary集合,它是线程安全的。

于 2012-08-30T20:24:02.687 回答
2

如果您正在使用C# 4.0或更多,您可以使用处理所有这些内容的ConcurentDictionary 。

如果你没有或4.0由于某种原因不能使用,是的,你需要自己实现锁定机制ReadWriteContains,模拟基本的ACID原理,比如

  • 一致的
  • 隔离
  • 耐用性。

在这种情况下,不要认为原子性有什么意义。

希望这可以帮助。

于 2012-08-30T20:23:59.817 回答
0

您可以使用 ConcurrentDictionary

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

于 2012-08-30T20:24:57.643 回答