MSDN指出对.NET Dictionary<K,V>
类型的变更访问不是线程安全的。是否有标准的线程安全版本?
注意:“没有”是有效答案,如果是真的话。在那种情况下(似乎是),我会去做锁定的事情。
What’s the best way of implementing a thread-safe Dictionary in .NET?(不完全是因为我想要一个标准类型,而不是我实现自己的东西)
答案 0 :(得分:3)
没有。请考虑此代码,其中每个方法/属性都是线程安全的
if (!SFdict.Contains(key))
{
SFdict[key] = value;
}
尽管每个动作都是线程安全的,但是代码块具有竞争条件,b / c有两个方法调用和两个不同的关键部分。唯一的方法是手工
lock(lck)
{
if (!dict.Contains(key))
{
dict[key] = value;
}
}
答案 1 :(得分:2)
虽然Hashtable
不是通用的,但只要你正确使用它(一个作者,多个读者,没有枚举),它就是线程安全的。
线程安全
支持一个或多个作家,全部 Hashtable上的操作必须是 通过返回的包装器完成 同步方法。
通过集合枚举是 本质上不是线程安全的 程序。即使是收藏品 同步,其他线程可以 仍然修改集合,其中 导致枚举器抛出一个 例外。保证线程安全 在枚举期间,您可以 在整个过程中锁定集合 枚举或捕获异常 由其他人做出的改变 线程。
它与Dictionary<K, V>
不同 - 它将返回null
,如果您尝试获取不存在的值,则不会抛出KeyNotFoundException
(因此存储空值可能有问题)。如果您知道您将永远不会有多个线程尝试添加新密钥,并且可以处理null
问题,那么这是一个非常有用的集合。
答案 2 :(得分:2)
.NET 4.0现在有一个ConcurrentDictionary<K,T>
类似乎可以做你想要的。 Also in .NET 4.5
答案 3 :(得分:1)
除了重复问题的答案之外,您可能需要查看this implementation that uses ReaderWriterSlim
。 ReaderWriterSlim
实际上应该比简单锁定(有效地使用Monitor
)提供一些性能优势 - 绝对可以看看。