たとえば、マルチスレッドのシナリオで使用されるクラスのリストがあるとします。スレッドセーフな方法でリストを列挙する
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?このアプローチはまだスレッドセーフですか?
MyItemsが参照型(オブジェクト)である場合、リストと配列の両方が同じオブジェクトを最終的に指しているため、Execute2は安全ではありません。 – Will
@ウィルこの特定のシナリオでは問題はありません。私はリスト自体についてのみ関心を持っています。必要であれば、オブジェクトは同期自体を処理できます。 – MikeSW
@HenkHolterman私はどのオブジェクトも使用できることは知っていますが、リストの同期オブジェクトを使用する方が良いかどうか疑問です。私はそれがなぜ公開されているのか、という意味ですか? – MikeSW