字典查找需要锁定吗?

lock(dictionaryX) { dictionaryX.TryGetValue(key, out value); } 

在查找字典时是否需要锁定?

程序是multithreading的,并且在向dict添加键/值时。 dict被锁定了。

只有在线程之间同步对资源的访问时才需要锁定。 只要没有涉及多个线程,就不需要锁定。

在更新和读取多个线程的值的上下文中,是绝对必要的锁定。 实际上,如果您使用的是4.0,则应考虑切换到专门为并发访问而设计的集合之一。

如上所述:

使用TryGetValue()而不锁定是不安全的。 字典暂时处于使其不适合读取而另一个线程正在编写字典的状态。 字典将随着其包含的条目数量的增长而不时重新组织。 当您在重新组织发生的确切时间进行读取时,在存储桶更新但尚未输入值时,您将面临找到错误值的风险。

更新:请看一下本页的 “线程安全”部分。

与编程中的许多微妙问题一样,答案是:不一定。

如果仅将值添加为初始化,则不需要同步后续读取。 但是,另一方面,如果您要随时阅读和写作,那么绝对需要保护该资源。

但是,完全lock可能不是最好的方法,具体取决于您的词典获得的流量。 如果您使用的是.NET 3.5或更高版本,请尝试使用ReaderWriterLockSlim

如果您有多个线程访问Dictionary,那么您需要锁定更新和查找。 您需要锁定查找的原因是,在您执行查找的同时可能会发生更新,并且在更新期间字典可能处于不一致状态。 例如,假设您有一个线程执行此操作:

 if (myDictionary.TryGetValue(key, out value)) { } 

一个单独的线程正在这样做:

 myDictionary.Remove(key); 

可能发生的是,执行TryGetValue的线程确定该项目在字典中,但在它可以检索项目之前,另一个线程将其删除。 结果是执行查找的线程将抛出exception,或者TryGetValue将返回truevalue将为null或可能是与键不匹配的对象。

这只是可能发生的一件事。 如果你在一个线程上进行查找而另一个线程添加了你想要查找的值,那么同样会发生灾难性的事情。

使用新的ConcurrentDictionary对象 ,您可以忘记必须执行任何锁定。

是的,您需要锁定字典以便在multithreading环境中进行访问。 写入字典不是primefaces的,因此可以添加键,但不能添加值。 在这种情况下,当您访问它时,您可能会遇到exception。

如果您使用的是.Net 4,则可以使用ConcurrentDictionary替换它以安全地执行此操作。 在System.Collection.Concurrent命名空间中 ,当您需要multithreading访问时,还有其他类似的集合。

如果这是您的选项,请不要使用自己动手锁定。

是的,如果此字典是多个线程之间的共享资源,则应锁定。 这可确保您获得正确的值,而其他线程不会在Lookup调用期间中途改变值。

是的,如果您在该字典上有multithreading更新,则必须锁定。 查看这篇精彩post了解详情: “线程安全”字典(TKey,TValue)

但是自从ConcurrentDictionary <>引入后,您可以通过.NET 4或在3.5中使用Rx (它包含System.Threading.dll以及新的线程安全集合的实现)来使用它。