列表副本线程安全吗?

时间:2014-06-11 20:42:44

标签: c# .net multithreading thread-safety

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

var collecation = new List<T>(sharedCollection);

其中sharedCollection可以由另一个线程同时修改(即添加或删除元素)?

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

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

2 个答案:

答案 0 :(得分:4)

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

编辑:只是关于何时错误锁定您正在修改的对象的注释 - 如果对象引用本身可以更改(如`sharedCollection = new List)或者它是否可以为null,然后创建一个单独的对象作为读/写发生的类的成员锁定。

答案 1 :(得分:0)

您可以锁定sharedCollection的SyncRoot对象。

在这里解释: Lock vs. ToArray for thread safe foreach access of List collection