네임스페이스에는 System.Collections.Concurrent 스레드로부터 안전하고 확장 가능한 여러 컬렉션 클래스가 포함되어 있습니다. 여러 스레드는 사용자 코드에서 추가 동기화를 요구하지 않고도 이러한 컬렉션에서 항목을 안전하고 효율적으로 추가하거나 제거할 수 있습니다. 새 코드를 작성할 때 동시 컬렉션 클래스를 사용하여 컬렉션에 여러 스레드를 동시에 작성합니다. 공유 컬렉션에서만 읽는 경우 네임스페이스의 클래스를 System.Collections.Generic 사용할 수 있습니다.
System.Collections 및 System.Collections.Generic
System.Collections 네임스페이스의 컬렉션 클래스에는 ArrayList 및 Hashtable가 포함되어 있습니다. 이러한 클래스는 컬렉션 주위를 감싸는 스레드 안전한 래퍼를 반환하는 Synchronized
속성을 통해 일부 스레드 보안을 제공합니다. 래퍼는 모든 추가 또는 제거 작업에서 전체 컬렉션을 잠그는 작업을 수행합니다. 따라서 컬렉션에 액세스하려는 각 스레드는 해당 순서가 하나의 잠금을 획득할 때까지 기다려야 합니다. 이 프로세스는 확장할 수 없으며 큰 컬렉션의 성능이 크게 저하될 수 있습니다. 또한, 디자인은 경합 조건에서 보호되지 않습니다. 자세한 내용은 제네릭 컬렉션의 동기화를 참조하세요.
System.Collections.Generic 네임스페이스의 컬렉션 클래스에는 List<T> 및 Dictionary<TKey,TValue>가 포함되어 있습니다. 이 클래스들은 System.Collections 클래스에 비해 향상된 형식 안전성 및 성능을 제공합니다. 그러나 클래스는 System.Collections.Generic 스레드 동기화를 제공하지 않습니다. 사용자 코드는 여러 스레드에서 항목을 동시에 추가하거나 제거할 때 모든 동기화를 제공해야 합니다.
네임스페이스에서 동시 컬렉션 클래스는 System.Collections.Concurrent 형식 안전성과 보다 효율적이고 완전한 스레드 보안을 제공하기 때문에 사용하는 것이 좋습니다.
세분화된 잠금 및 잠금 없는 메커니즘
일부 동시 컬렉션 형식은 SpinLock, SpinWait, SemaphoreSlim, CountdownEvent 같은 간단한 동기화 메커니즘을 사용합니다. 이러한 동기화 형식은 일반적으로 스레드를 실제 상태로 전환하기 전에 짧은 기간 동안 Wait
를 사용합니다. 대기 시간이 짧을 것으로 예상되는 경우 회전은 대기보다 계산 비용이 훨씬 적게 들며, 여기에는 비용이 많이 드는 커널 전환이 포함됩니다. 회전을 사용하는 컬렉션 클래스의 경우 이 효율성은 여러 스레드가 높은 속도로 항목을 추가하고 제거할 수 있음을 의미합니다. 회전 및 차단에 대한 자세한 내용은 SpinLock 및 SpinWait을 참조하세요.
및 ConcurrentQueue<T> 클래스는 ConcurrentStack<T> 잠금을 전혀 사용하지 않습니다. 대신 스레드 안전을 달성하기 위해 Interlocked 작업에 의존합니다.
비고
동시에 존재하는 컬렉션 클래스는 ICollection을 지원하므로, IsSynchronized 및 SyncRoot 속성에 대한 구현을 제공하며, 이러한 속성은 관련이 없습니다.
IsSynchronized
는 항상 false
를 반환하고, SyncRoot
는 항상 null
입니다 (Nothing
는 Visual Basic에서).
다음 표에서는 네임스페이스의 컬렉션 형식을 System.Collections.Concurrent 나열합니다.
유형 | 설명 |
---|---|
BlockingCollection<T> | IProducerConsumerCollection<T>을(를) 구현하는 모든 형식에 대한 경계 및 제한 기능을 제공합니다. 자세한 내용은 BlockingCollection 개요를 참조하세요. |
ConcurrentDictionary<TKey,TValue> | 키-값 쌍 사전의 스레드 안전한 구현. |
ConcurrentQueue<T> | FIFO(선입선출) 큐의 스레드 안전한 구현입니다. |
ConcurrentStack<T> | 후입선출 스택의 스레드 안전한 구현입니다. |
ConcurrentBag<T> | 정렬되지 않은 요소 컬렉션의 스레드 안전한 구현입니다. |
IProducerConsumerCollection<T> | 해당 형식이 BlockingCollection 에서 사용되도록 구현해야 하는 인터페이스입니다. |
관련 문서
제목 | 설명 |
---|---|
BlockingCollection의 개요 | 형식에서 제공하는 BlockingCollection<T> 기능을 설명합니다. |
방법: ConcurrentDictionary에서 항목 추가 및 제거 | 에서 요소를 추가하고 제거하는 방법을 설명합니다. ConcurrentDictionary<TKey,TValue> |
방법: BlockingCollection에서 개별적으로 항목 추가 및 가져오기 | 읽기 전용 열거자를 사용하지 않고 차단 컬렉션에서 항목을 추가하고 검색하는 방법을 설명합니다. |
방법: 컬렉션에 경계 및 차단 기능 추가 | 컬렉션 클래스를 컬렉션의 기본 스토리지 메커니즘 IProducerConsumerCollection<T> 으로 사용하는 방법을 설명합니다. |
방법: ForEach를 사용하여 BlockingCollection에서 항목 제거 |
foreach (For Each Visual Basic에서) 차단된 컬렉션의 모든 항목을 제거하는 방법을 설명합니다. |
방법: 파이프라인에서 차단 컬렉션 배열 사용 | 여러 차단 컬렉션을 동시에 사용하여 파이프라인을 구현하는 방법을 설명합니다. |
방법: ConcurrentBag을 사용하여 개체 풀 만들기 | 새 항목을 지속적으로 만드는 대신 개체를 다시 사용할 수 있는 시나리오에서 동시 모음을 사용하여 성능을 향상시키는 방법을 보여 줍니다. |
참고 문헌
.NET