다음을 통해 공유


컬렉션과 동기화(스레드로부터의 안전성)

업데이트: 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

System.Collections.Specialized

System.Collections.Generic

기타 리소스

컬렉션 만들기 및 조작