Eri*_*bes 15 c# collections multithreading thread-safety
我可以在没有锁定的情况下从多个线程安全地调用List.AddRange(r)吗?如果没有,我会遇到什么样的麻烦?
不,不是,但我想补充一点,myList.AddRange(...);在锁内做一个比做几个更有效lock (syncLock) { myList.Add(...) };.
你会遇到哪种麻烦?当一个线程正在添加一个项目而另一个线程正在枚举列表时,List<T>会抛出一个异常,因为它会进行一些内部版本控制,因为它希望阻止我们糟糕的开发人员遇到令人讨厌的副作用.
另外,List<T>在内部保存在其中存储其项目的数组.也许在数组中设置一个项目是非常原子的,但是每当达到此数组的容量时,将创建一个新项目,并且将从旧项目中复制项目.因此,当一个线程想要在复制发生时添加一些东西时,你可以想象事情会不同步.