列表复制线程安全吗
本文关键字:安全 线程 复制 列表 | 更新日期: 2023-09-27 18:08:17
在多线程场景中使用以下模式安全吗?:
var collection = new List<T>(sharedCollection);
其中sharedCollection
可以由另一个线程同时修改(即添加或删除元素(?
我目前处理的场景是从BindingList
复制项目,但这个问题应该与任何标准集合类型有关。
如果它不是线程安全的,我应该锁定sharedCollection
吗?或者有更好的解决方案吗?
您似乎已经回答了自己的问题。不,将更改列表复制到另一个列表不是线程安全的,是的,您可以锁定sharedCollection
。请注意,在复制sharedCollection
时仅锁定它是不够的;无论何时阅读或更改其内容,都需要将其锁定。
编辑:只需注意何时锁定正在修改的对象是错误的——如果对象引用本身可以更改(如`sharedCollection=new List(,或者它可以为null,那么制作一个单独的对象来锁定为正在进行读/写的类的成员。
您可以锁定sharedCollection
的SyncRoot对象。
请在此处解释:Lock与ToArray用于List集合的线程安全foreach访问