【发布时间】:2012-12-30 15:54:39
【问题描述】:
对Dictionary 应用双重检查锁定是否安全?
即从不同线程调用TryGetValue 和其他“get/contains”方法是否安全? (不调用其他非 get 方法)。
upd 收藏对 N 个读者和 1 个作者来说是安全的吗?假设在循环 10 中,线程尝试使用双重检查锁定访问带有键 X 的元素,如果访问,它们只是将其删除。在某些时候,我确实从另一个线程添加了带有键 X 的元素(使用锁)。我希望只有一位读者应该获取此元素并将其删除。
upd2,关于答案,所以我的问题令人困惑。其实我问了两个问题:
- 从不同线程调用
TryGetValue和其他“get/contains”方法是否安全? (不调用其他非 get 方法)。 - N 位读者和 1 位作者的收藏是否安全?
第一个问题的答案是肯定的,第二个问题的答案是否定的。
所以有时apply double-checked locking 是安全的,有时却不是。这取决于您是否同时写入集合。
【问题讨论】:
-
根据规格,分析器是肯定的:msdn.microsoft.com/en-us/library/xfhwa508.aspx
-
我不知道您需要为作为只读数据结构(又名不可变类型)访问的数据结构使用锁,该数据结构本质上是线程安全的。如果您从不更改它,则根本不需要锁。
-
如果您使用的是 .NET 4.0 或更高版本,您可以使用此 ConcurrentDictionary。
-
@AloisKraus 使用双重检查锁定的要点是在不需要赢得几纳秒的情况下不使用锁定,我在编写 HFT 时确实需要它们。
-
ConcurrentDictionary 是一个几乎无锁的数据结构。在引擎盖下,它确实使用了类似的模式来实现几乎无锁的更新。
标签: c#