假设我有这个静态列表,它在不同的线程之间共享:
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中的内容相同,而不是传递引用?
答案 0 :(得分:1)
如果需要同步对列表元素的访问,而不是列表本身。然后继续并同步访问那些元素方法,而不是列表。
答案 1 :(得分:1)
是的,如果要避免在线程之间对列表myClass
元素的访问进行同步,请执行列表的深层副本。
就违反锁定的术语而言,最好说缺少myClass
元素的同步。锁定 fooList
的实例仅对该实例有意义。如果只允许通过List访问myClass
个对象的实例,那么fooList
上的同一个锁也会保护它们。如果你做了List容器的浅表副本,那么对于lock (myClass element)
个对象的每个实例,你需要myClass
,完全不同的锁。因此我解释了缺少同步。