列表复制线程安全吗

本文关键字:安全 线程 复制 列表 | 更新日期: 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访问