线程之间共享的列表:在引用共享列表元素的特定线程中构建新列表?

时间:2013-08-24 23:43:46

标签: multithreading list

假设我有这个静态列表,它在不同的线程之间共享:

public static List<myClass> fooList = new List<myClass>();

现在,我想在一个线程中访问此共享列表以构建自己的私有列表,我想执行以下操作:

List<myClass> newFooList = new List<myClass>();

lock (fooList)
{
   foreach (myClass element in fooList)
   {
    newFooList.Add(element);
   }
}

但是,如果我这样做,我正在构建一个新的列表,它引用与共享列表相同的元素,所以如果以后我访问newFooList而没有任何锁定(因为它应该是)我实际上是访问它共享列表的元素,因此违反了锁定,对吧?

那么,解决方法是在newFooList中创建新元素,其内容与fooList中的内容相同,而不是传递引用?

2 个答案:

答案 0 :(得分:1)

如果需要同步对列表元素的访问,而不是列表本身。然后继续并同步访问那些元素方法,而不是列表。

答案 1 :(得分:1)

是的,如果要避免在线程之间对列表myClass元素的访问进行同步,请执行列表的深层副本。

就违反锁定的术语而言,最好说缺少myClass元素的同步。锁定 fooList的实例仅对该实例有意义。如果只允许通过List访问myClass个对象的实例,那么fooList上的同一个锁也会保护它们。如果你做了List容器的浅表副本,那么对于lock (myClass element)个对象的每个实例,你需要myClass,完全不同的锁。因此我解释了缺少同步。