列表复制线程安全吗?

Ale*_*ope 5 .net c# multithreading thread-safety

在多线程场景中使用以下模式是否安全:

var collecation = new List<T>(sharedCollection);
Run Code Online (Sandbox Code Playgroud)

哪里sharedCollection可以同时被另一个线程修改(即添加或删除元素)?

我目前正在处理的场景是从 BindingList 复制项目,但问题应该与任何标准集合类型相关。

如果它不是线程安全的,我应该锁定sharedCollection,还是有更好的解决方案?

adv*_*v12 5

您似乎已经回答了自己的问题。不,将更改列表复制到另一个列表不是线程安全的,是的,您可以锁定sharedCollection. sharedCollection请注意,复制时仅锁定是不够的;当您阅读或更改其内容时,您也需要将其锁定。

编辑:只是注意一下何时锁定正在修改的对象是不好的——如果对象引用本身可以更改(如`sharedCollection = new List)或者如果它可以为空,则创建一个单独的对象来锁定作为正在进行阅读/写作的班级的成员。