HashSet遍历时保证线程安全

知识前提:HashSet是线程安全集合,但仅限于多个线程同时对一个HashSet集合修改。

遇到的问题:多个线程同时对集合进行修改时没有遇到任何为题,但是当有一个线程在遍历的过程中对元素进行新增和删除时,此时是线程不安全的。


解决方案:其实很简单,我们只要保证遍历和集合修改时有一个互斥锁就能保证线程安全。


代码如下:

public class BlockingHashSet : HashSet
    {
        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 CopyToList()
        {
            lock (this)
            {
                return this.ToList();
            }
        }
    }
看代码就明白,当我们需要安全的遍历时就先安全的复制一份新的集合去遍历。

你可能感兴趣的:(C#语法,线程安全)