假设我有ConcurrentDictionary<int, HashSet<int>> sampleCollection;
. sampleCollection[1]
对(这是 a )执行操作是否是线程安全的HashSet<int>
?
一般来说,如果我们在一个线程安全的集合里面有一个非线程安全的集合,那么通过线程安全的外层来操作这个非线程安全的集合是线程安全的吗?
假设我有ConcurrentDictionary<int, HashSet<int>> sampleCollection;
. sampleCollection[1]
对(这是 a )执行操作是否是线程安全的HashSet<int>
?
一般来说,如果我们在一个线程安全的集合里面有一个非线程安全的集合,那么通过线程安全的外层来操作这个非线程安全的集合是线程安全的吗?
HashSet 不知道它是在一个安全的数据结构中聚合的。它没有办法找出来。它无法调整它的行为。
即使 HashSet 是特殊情况下以某种方式合作并且在这个星座中是安全的,你也永远不能假设对于任意类型。
数据结构和算法必须专门设计为线程安全的。任何没有记录为安全的东西都被认为是不安全的。
如果 HashSet在第一次进入 ConcurrentDictionary 后可以修改,那么它不是线程安全的。正确答案是否定的。
从这里的其他答案中,您已经了解到HashSet<int>
inConcurrentDictionary<int, HashSet<int>> sampleCollection;
不是线程安全的,因为(正如@usr 所说的那样),它无法发现它是在线程安全的数据结构中聚合的。
您可以改为使用ConcurrentDictionary<int, ConcurrentBag<int>> sampleCollection;
来实现您的目的。