2014-06-11 51 views
2

是可以安全使用以下方式在多线程场景:列表复制线程安全吗?

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

其中sharedCollection可以在同一时间被另一个线程修改(即添加或删除的元素从它)?

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

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

+9

_Nothing_约'名单'突变是线程安全的。 – SLaks

回答

3

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

编辑:只是一个约时,它的锁定你正在修改的对象注意 - 如果对象引用本身是可以改变的(比如`sharedCollection =新的列表),或者如果它可以为null,则让一个单独的对象作为发生阅读/写作的类的成员进行锁定。

+0

我希望收集副本是线程安全的,所以不需要锁定。在这种情况下,我将在GUI线程上创建列表副本以避免锁定。 –

+1

@AlexanderPope,''sharedCollection'可以在后台线程修改,而你正在GUI线程上复制它?如果是这样,你仍然不是线程安全的。你要么确保列表只被一个线程使用,要么一路锁定...... – adv12

+0

不,用例是根据某些标准从绑定中删除项目,并且为此,我需要要迭代的绑定列表的副本。我不喜欢在gui主题上制作副本的想法,但这似乎是最干净的方式。我知道锁定集合可能会导致死锁,但我想尽可能地提出问题的基本原则。 –