知识前提:HashSet<T>是线程安全集合,但仅限于多个线程同时对一个HashSet<T>集合修改。
遇到的问题:多个线程同时对集合进行修改时没有遇到任何为题,但是当有一个线程在遍历的过程中对元素进行新增和删除时,此时是线程不安全的。
解决方案:其实很简单,我们只要保证遍历和集合修改时有一个互斥锁就能保证线程安全。
代码如下:
public class BlockingHashSet<T> : HashSet<T> { public new bool Add(T item) { bool result = false; lock (this) { result = base.Add(item); } return result; } public new bool Remove(T item) { bool result = false; lock (this) { result = base.Remove(item); } return result; } public IList<T> CopyToList() { lock (this) { return this.ToList<T>(); } } }看代码就明白,当我们需要安全的遍历时就先安全的复制一份新的集合去遍历。