[英]Standard Thread safe .Net Dictionary
MSDN指出,更改对.NET Dictionary<K,V>
类型的访问权限不是线程安全的。 有标准的线程安全版本吗?
注意: “没有就没有”是正确的答案。 在那种情况下(看来是这样),我会去做锁事情。
在.NET中实现线程安全字典的最佳方法是什么? (不完全是因为我想要一个标准类型,而不是我实现自己的东西)
没有。 考虑一下此代码,其中每个方法/属性都是线程安全的
if (!SFdict.Contains(key))
{
SFdict[key] = value;
}
尽管每个动作都可能是线程安全的,但是代码块具有竞争条件,b / c有两个方法调用和两个不同的关键部分。 唯一的方法是手工
lock(lck)
{
if (!dict.Contains(key))
{
dict[key] = value;
}
}
尽管Hashtable
不是通用的,但只要您正确使用它(一个写入器,多个读取器,没有枚举),它就具有线程安全性。
线程安全
为了支持一个或多个编写器,必须通过Synchronized方法返回的包装器对Hashtable进行所有操作。
通过集合进行枚举本质上不是线程安全的过程。 即使同步了一个集合,其他线程仍然可以修改该集合,这将导致枚举器引发异常。 为了保证枚举期间的线程安全,您可以在整个枚举期间锁定集合,也可以捕获由其他线程进行的更改导致的异常。
但是它与Dictionary<K, V>
有所不同-如果您尝试获取不存在的值,它将返回null
,而不抛出KeyNotFoundException
(因此存储null值可能会出现问题)。 如果您知道尝试添加新密钥的线程永远不会超过一个,并且可以处理null
问题,那么这是一个非常有用的集合。
.NET 4.0现在具有ConcurrentDictionary<K,T>
类,该类似乎可以满足您的要求。 也在.NET 4.5中
除了重复问题的答案外,您可能还想看一下使用ReaderWriterSlim
实现 。 ReaderWriterSlim
应该比简单的锁定(有效使用Monitor
)提供一些性能上的好处-一定要看看。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.