对Dictionary应用双重检查锁定是否安全?

本文关键字:锁定 是否 安全 检查 Dictionary 应用 | 更新日期: 2023-09-27 17:49:48

Dictionary应用双重检查锁定安全吗?

。如果它安全调用TryGetValue和其他"get/contains"方法从不同的线程?(不调用其他非get方法)。

upd收集对于N个读程序和1个写程序是安全的吗?假设在循环10中,线程尝试使用双重检查锁定访问键X的元素,如果访问了它们就删除它。在某些时候,我确实从另一个线程添加了键为X的元素(使用锁)。我希望只有一个读者能得到这个元素并删除它。

upd2,关于答案所以我的问题是令人困惑的。实际上我问了两个问题:

  1. 如果它安全调用TryGetValue和其他"获取/包含"的方法从不同的线程?(不调用其他非get方法)。
  2. 收集对于N个读取器和1个写入器是安全的吗?

第一个问题的答案是肯定的,第二个问题的答案是否定的。

所以有时对apply double-checked locking是安全的,有时不是。这取决于你是否同时写入一个集合

对Dictionary应用双重检查锁定是否安全?

我假设您正在谈论通用Dictionary<TKey, TValue>类。该类对于N个读取器或1个写入器是安全的。因此,只要你不修改它,你可以有任意多的线程来读取它,而不需要锁。

如果一个线程可能想要修改字典,你必须同步访问它。我推荐ReaderWriterLockSlim

这是不安全的,因为没有文档说明它是安全的。你不能有一个写入器和N个读取器。

这是来自文档的一个适用的句子:

一个Dictionary可以同时支持多个reader,

实际上,如果你用反射器窥视字典,你可以看到它是不安全的,但这不是重点。关键是你不能依赖未记录的属性,因为它们可以随时更改,在生产中引入没有人知道的bug。

你也不能测试它是安全的。它可能在你的盒子上有用,在别的地方坏了。这就是线程错误的本质。不值得。