知识前提: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>();
}
}
}
看代码就明白,当我们需要安全的遍历时就先安全的复制一份新的集合去遍历。