멀티 쓰레딩 시나리오에서 사용할 클래스에 목록이 있다고 가정 해 봅니다.스레드로부터 안전한 방법으로 목록 열거하기
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
@Will이 특정 시나리오에서는 문제가되지 않습니다. 목록 자체에 대해서만 염려합니다. 필요한 경우 개체가 자체적으로 동기화를 처리 할 수 있습니다. – MikeSW
@HenkHolterman 모든 개체를 사용할 수 있지만 목록의 동기화 개체를 사용하는 것이 더 나은지 궁금합니다. 내 말은 그게 노출 된 이유야. – MikeSW