.NET Framework 1.0에서 도입된 컬렉션은 System.Collections 네임스페이스에서 찾을 수 있습니다. 이 컬렉션들, 특히 일반적으로 사용되는 ArrayList와 Hashtable은 Synchronized 속성을 통해 일종의 스레드 안전을 제공하며, 이 속성은 컬렉션과 관련된 스레드 안전 래퍼를 반환합니다. 래퍼는 각 추가 또는 제거 연산마다 전체 집합을 잠그면서 작동합니다. 따라서 컬렉션에 접근하려는 각 스레드는 잠금을 획득할 차례가 될 때까지 기다려야 합니다. 이는 확장 불가능하며 대규모 컬렉션의 성능 저하를 초래할 수 있습니다. 게다가 이 설계가 경쟁을 완전히 방지하지는 않습니다. 자세한 내용은 MSDN 웹사이트의 다음 페이지를 참조하세요: 일반 컬렉션에서의 동기화
.NET Framework 2.0에서 도입된 컬렉션 클래스는 System.Collections.Generic 네임스페이스에서 찾을 수 있습니다. 이 컬렉션 수업에는 List<T>, Dictionary< TKey, TValue 등이 포함됩니다> 이 클래스들은 .NET Framework 1.0 클래스에 비해 더 높은 타입의 보안성과 성능을 제공합니다. 하지만 .NET Framework 2.0 컬렉션 클래스는 스레드 동기화를 제공하지 않습니다; 여러 스레드에서 항목을 동시에 추가하거나 제거할 때는 사용자 코드가 모든 동기화를 제공해야 합니다.
.NET Framework 4에서 동시 컬렉션 클래스를 사용하는 것을 권장합니다. 이는 .NET Framework 2.0 컬렉션 클래스의 타입 안전성뿐만 아니라 .NET Framework 1.0 컬렉션이 제공하는 스레드 보안보다 더 효율적이고 완전한 스레드 보안을 제공하기 때문입니다.
일부 동시 컬렉션 유형은 SpinLock, SpinWait, SemaphoreSlim, CountdownEvent와 같은 경량 동기화 메커니즘을 사용하며, 이는 .NET Framework 4에서 새롭게 도입되었습니다. 일반적으로 위의 동기화 유형은 스레드를 실제 대기 상태로 전환하기 전에 짧은 시간 동안 "비시 스핀"을 사용합니다. 대기 시간이 매우 짧을 것으로 예상된다면, 스핀은 대기보다 훨씬 적은 연산 자원을 소모하며, 대기에는 커널 변환이 포함되어 많은 자원을 소비합니다. 회전을 사용하는 컬렉션 클래스의 경우, 이 효율성은 여러 스레드가 매우 빠른 속도로 항목을 추가하고 제거할 수 있음을 의미합니다. 제한과 차단에 대한 자세한 내용은 SpinLock과 SpinWait를 참조하세요. ConcurrentQueue<T>와 ConcurrentStack<T> 클래스는 잠금을 전혀 사용하지 않습니다. 대신 스레드 안전을 위해 상호 잠금 연산에 의존합니다.
설명
동시 컬렉션 클래스는 ICollection을 지원하기 때문에, IsSynchronized와 SyncRoot 속성이 관련이 없더라도 구현을 제공합니다. IsSynchronized는 항상 false를 반환하지만, SyncRoot는 항상 null(Visual Basic에서는 아무것도 없음)입니다.
다음 표는 System.Collections.Concurrent 네임스페이스의 컬렉션 유형을 나열합니다.
형 | 묘사 | 블로킹컬렉션<T> | <T> IProducerConsumerCollection 구현을 위한 모든 유형의 제한 및 차단 기능을 제공합니다. 자세한 내용은 BlockingCollection 개요를 참조하세요. | ConcurrentDictionary<TKey, TValue> | 키/값은 사전의 스레드 안전 구현입니다. | 동시 대기열<T> | FIFO(선입선출) 큐의 스레드 안전 구현. | 컨커런스택<T> | LIFO(후입선출) 스택의 스레드 안전 구현. | 컨커런티백<T> | 순서가 맞지 않는 요소 집합의 스레드 안전 구현. | IProducerConsumerCollection<T> | 타입은 반드시 구현되어야 합니다.블로킹컬렉션사용되는 인터페이스
|
|