0

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

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 中的新元素具有相同的内容,而不是传递引用?

4

2 回答 2

1

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

至于违反锁的术语,最好说缺少元素的同步myClass。实例上锁定fooList仅对该实例有意义。如果只允许通过 List 访问myClass对象的实例,那么同样的锁fooList也可以保护它们。如果您对 List 容器进行了浅拷贝,那么您将需要lock (myClass element)对每个myClass对象实例使用完全不同的锁。因此,我对缺少同步的解释。

于 2013-08-26T02:04:18.183 回答
1

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

于 2013-08-24T23:47:28.130 回答