0

この共有リストがあります。「MyObject」は、作成後にオブジェクトを変更できないクラスを表します。

List<MyObject> fooList;

.add または .remove メソッド (fooList を変更できる唯一のもの) が fooList で呼び出されると、fooList がロックされます (Monitor.TryEnter...)

各スレッドは、fooList をロックしながら、アクセス中にこれを行うことができます。

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

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

foreach 反復の進行中に fooList に .add または .remove メソッドが呼び出されないようにするためだけにロックが存在すると仮定するのは正しいですか (したがって、それを無効にします)。

言い換えれば、プログラムの最初から fooList が不変だった場合、ロックを解除しても安全でしょうか?

4

1 に答える 1

1

fooListが実際に作成後に変更されない場合は、そこから値を読み取るときにロックする必要はありません。これには、その上で使用foreachすることも含まれます。

fooList作成後に実際に変更されない場合は、ReadOnlyCollection<Foo>代わりに使用しないでList<Foo>ください。これは、変更されないリストを作成する、より宣言的で強制可能な方法です。リストの将来の偶発的な変更からあなたを守ります

于 2013-08-25T02:30:49.447 に答える