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

Multithreading 线程间共享列表:在引用共享列表元素的特定线程中构建新列表?,multithreading,list,Multithreading,List,假设我有一个在不同线程之间共享的静态列表: public static List<myClass> fooList = new List<myClass>(); publicstaticlist=newlist(); 现在,我想在一个线程中访问这个共享列表以构建它自己的私有列表,我想执行以下操作: List<myClass> newFooList = new List<myClass>(); lock (fooList) { forea

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

public static List<myClass> fooList = new List<myClass>();
publicstaticlist=newlist();
现在,我想在一个线程中访问这个共享列表以构建它自己的私有列表,我想执行以下操作:

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

lock (fooList)
{
   foreach (myClass element in fooList)
   {
    newFooList.Add(element);
   }
}
List newwhoolist=newlist();
锁(傻瓜)
{
foreach(愚人主义中的myClass元素)
{
添加(元素);
}
}
但是如果我这样做了,我正在构建一个新的列表,它引用了与共享列表相同的元素,因此如果以后我访问new傻瓜列表而没有任何锁(应该是这样的),我实际上正在访问共享列表的相同元素,因此违反了锁,对吗


因此,解决方案是使new傻瓜列表中的新元素具有与傻瓜列表中的元素相同的内容,而不是传递引用?

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

是的,如果希望避免在线程之间访问列表
myClass
元素时必须同步,请执行列表的深度复制

至于违反锁的术语,最好说
myClass
的元素缺少同步。只有在该实例中,
dublist
实例上的锁才有意义。如果只允许通过列表访问
myClass
对象的实例,那么
dublist
上的相同锁也会保护它们。如果您创建了列表容器的浅层副本,那么对于
myClass
对象的每个实例,您都需要使用完全不同的锁。因此,我解释了缺少同步化