HashSet遍历时保证线程安全

来源:互联网 发布:朝鲜妹子 知乎 编辑:程序博客网 时间:2024/06/02 02:55

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

原创粉丝点击