マルチスレッドのシナリオで使用されるクラスにリストがあるとしましょう。
public class MyClass
{
List<MyItem> _list= new List<MyItem>();
protected object SyncRoot {
get {
return ((IList)_list).SyncRoot;
}
}
public void Execute1()
{
lock(SyncRoot)
{
foreach(var item in _list) DoSomething(item);
}
}
public void Execute2()
{
Item[] list;
lock(SyncRoot)
{
list=_list.ToArray();
}
for(var i=0;i<list.Length;i++) DoSomething(list[i]);
}
}
メソッドExecute1は、スレッドセーフな方法でリストを列挙する「通常の」方法です。しかし、Execute2はどうですか? このアプローチはまだスレッドセーフですか?