2010-04-14 2 views
10

여기에 대해 System.Collections.Generic.List<T>에 대해 이야기하기.둘 이상의 스레드가 같은 목록 <t>에 문제없이 반복 할 수 있습니까?

아래의 예와 같이 문제가없는 다른 스레드에서 Method1과 Method2가 동시에 실행될 수 있습니까? 너무 오래 더 스레드가 목록을 수정 이다 없기 때문에 여러 스레드에서 읽기에

감사

class Test 
{ 
    private readonly List<MyData> _data; 

    public Test() 
    { 
     _data = LoadData(); 
    } 

    private List<MyData> LoadData() 
    { 
     //Get data from dv. 
    } 

    public void Method1() 
    { 
     foreach (var list in _data) 
     { 
      //do something 
     } 
    } 

    public void Method2() 
    { 
     foreach (var list in _data) 
     { 
      //do something 
     } 
    } 
} 

답변

22

예, List<T>는 안전합니다. the docs에서

하십시오 List<T>는만큼 컬렉션이 변경되지 않는 한, 동시에 여러 독자를 지원할 수

. 컬렉션을 통해 열거하는 것은 본질적으로 스레드로부터 안전하지 않은 프로 시저입니다 ( ). 드물게 열거 형에 하나 이상의 쓰기 액세스가있는 경우에는 스레드 안전성을 보장하는 유일한 방법은 전체 열거 중에 컬렉션을 잠그는 것입니다. 컬렉션을 읽고 쓰는 여러 스레드에서 액세스 할 수있게하려면 자신의 동기화를 구현해야합니다.

(반복하는 "이 프로시 저는 기본적으로 스레드로부터 안전이 없다"뭔가 다른 목록을 돌연변이에 대하여 만든 것에 대해 포인트입니다.)

0
당신은 잘 foreach 문에 의해받은 반복자()를 사용할 수

여러 스레드에서. elemnts를 목록에 추가하거나 제거하지 않는 한 괜찮습니다. 나는 당신이 당신이 무엇이든간에 멤버를 수정한다고 믿지만, 이것은 당신을 스레드 안전하지 않은 영역으로 데려다 줄 것입니다.

관련 문제