0

我们有这个共享列表,其中“MyObject”代表一个类,其对象在创建后无法修改

List<MyObject> fooList;

当在 fooList 上调用 .add 或 .remove 方法(这是唯一可以改变 fooList 的方法)时,fooList 被锁定(Monitor.TryEnter...)

每个线程都可以在访问它时执行此操作,同时还锁定 fooList:

foreach (MyObject o in fooList)
{
    myList.Add(o);
}

foreach (MyObject o in myList)
{
    Console.WriteLine(o.ToString());
}

假设存在锁只是为了确保 fooList 在 foreach 迭代正在进行时不会调用任何 .add 或 .remove 方法(因此使其无效)是否正确?

换句话说,如果 fooList 从程序一开始就是不可变的,那么移除锁是否安全?

4

1 回答 1

1

如果fooList确实在创建后从未修改过,那么当您从中读取值时就不需要锁。这包括使用foreach它。

如果确实fooList在创建后从未修改过,那么为什么不使用ReadOnlyCollection<Foo>而不是List<Foo>. 这是一种更具声明性和可执行性的方法,用于创建不会更改的列表。它将保护您免受列表的未来意外突变

于 2013-08-25T02:30:49.447 回答