컬렉션과 동기화(스레드로부터의 안전성)
업데이트: 2007년 11월
기본적으로 System.Collections의 클래스 및 관련 네임스페이스는 스레드로부터 안전하지 않습니다. 여러 읽기 스레드가 컬렉션을 안전하게 읽을 수 있지만, 컬렉션이 수정될 경우 읽기 스레드를 포함하여 컬렉션에 액세스하고 있는 모든 스레드에 정의되지 않은 결과가 발생합니다.
System.Collections 클래스는 다음과 같은 메서드를 사용하여 스레드로부터의 안전성을 확보할 수 있습니다.
Synchronized 메서드를 사용하여 스레드로부터 안전한 래퍼를 만들고 이 래퍼를 통해 독점적으로 컬렉션에 액세스합니다.
클래스가 Synchronized 메서드를 가지고 있지 않은 경우, 클래스에서 파생시키고 SyncRoot 속성을 사용하여 Synchronized 메서드를 구현합니다.
컬렉션에 액세스할 때 SyncRoot 속성에 대해 C#의 lock 문(Visual Basic의 경우 SyncLock, C++의 경우 Monitor 클래스)과 같은 잠금 메커니즘을 사용합니다.
Synchronized 메서드를 구현할 때 파생된 클래스는 IsReadOnly 속성을 재정의하여 올바른 값이 반환되도록 해야 합니다.
Array 클래스에는 Synchronized 메서드가 포함되지 않으며 SyncRoot 속성이 포함되지만 클래스는 파생시킬 수 없습니다. 따라서, 배열은 잠금 메커니즘을 통해서만 스레드로부터의 안전성을 확보할 수 있습니다.
제네릭 컬렉션 클래스에는 동기화 멤버가 포함되지 않지만 Collection<T>, Dictionary<TKey, TValue> 및 List<T>과 같은 일부 제네릭 클래스는 제네릭이 아닌 ICollection 인터페이스에서 상속되는 동기화 멤버를 명시적으로 구현합니다.
참고 항목
참조
System.Collections.Specialized