对Dictionary应用双重检查锁定是否安全?
本文关键字:锁定 是否 安全 检查 Dictionary 应用 | 更新日期: 2023-09-27 17:49:48
对Dictionary
应用双重检查锁定安全吗?
。如果它安全调用TryGetValue
和其他"get/contains"方法从不同的线程?(不调用其他非get方法)。
upd收集对于N个读程序和1个写程序是安全的吗?假设在循环10中,线程尝试使用双重检查锁定访问键X的元素,如果访问了它们就删除它。在某些时候,我确实从另一个线程添加了键为X的元素(使用锁)。我希望只有一个读者能得到这个元素并删除它。
upd2,关于答案所以我的问题是令人困惑的。实际上我问了两个问题:
- 如果它安全调用
TryGetValue
和其他"获取/包含"的方法从不同的线程?(不调用其他非get方法)。 - 收集对于N个读取器和1个写入器是安全的吗?
第一个问题的答案是肯定的,第二个问题的答案是否定的。
所以有时对apply double-checked locking
是安全的,有时不是。这取决于你是否同时写入一个集合
我假设您正在谈论通用Dictionary<TKey, TValue>
类。该类对于N个读取器或1个写入器是安全的。因此,只要你不修改它,你可以有任意多的线程来读取它,而不需要锁。
如果一个线程可能想要修改字典,你必须同步访问它。我推荐ReaderWriterLockSlim
这是不安全的,因为没有文档说明它是安全的。你不能有一个写入器和N个读取器。
这是来自文档的一个适用的句子:
一个Dictionary可以同时支持多个reader,
实际上,如果你用反射器窥视字典,你可以看到它是不安全的,但这不是重点。关键是你不能依赖未记录的属性,因为它们可以随时更改,在生产中引入没有人知道的bug。
你也不能测试它是安全的。它可能在你的盒子上有用,在别的地方坏了。这就是线程错误的本质。不值得。