假设我有ConcurrentDictionary<int, HashSet<int>> sampleCollection;。在sampleCollection[1] (一个HashSet<int>)上执行操作是线程安全的吗?
一般来说,如果我们在线程安全的集合内有一个非线程安全的集合,那么通过外部的线程安全的集合来操作这个非线程安全的集合是线程安全的吗?
发布于 2015-10-07 22:49:32
HashSet不知道它是在一个安全的数据结构中聚合的。它没有办法找到答案。它不能调整它的行为。
即使HashSet在这个星座中是以某种方式协作和安全的,你也永远不能假设它是一个任意类型。
数据结构和算法必须经过特殊设计才能保证线程安全。任何未记录为安全的内容都被认为是不安全的。
发布于 2015-10-07 22:49:59
如果HashSet在第一次进入ConcurrentDictionary之后可以被修改,那么它就不是线程安全的。正确的答案是No。
发布于 2015-10-07 23:22:25
从这里的其他答案中,您已经了解到ConcurrentDictionary<int, HashSet<int>> sampleCollection;中的HashSet<int>不是线程安全的,因为(正如@usr所说的那样),它无法发现它是在线程安全的数据结构中聚合的。
您可以使用ConcurrentDictionary<int, ConcurrentBag<int>> sampleCollection;来实现您的目的。
https://stackoverflow.com/questions/32995237
复制相似问题