字典查找需要锁定吗?
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
将返回true
但value
将为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以及新的线程安全集合的实现)来使用它。