Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# 스레드 안전(Thread-Safe) 컬렉션 완벽 정리

C# 스레드 안전 컬렉션이란?

.NET Framework 4부터 System.Collections.Concurrent 네임스페이스가 새롭게 도입되었습니다. 이 네임스페이스에는 다양한 컬렉션 클래스가 포함되어 있으며, 이 클래스들은 스레드로부터 안전(Thread-Safe)하고 뛰어난 확장성(Scalability)을 갖추고 있습니다.

일반적인 컬렉션(List, Dictionary 등)은 여러 스레드가 동시에 접근하면 데이터 손상이나 예외가 발생할 수 있지만, 동시성 컬렉션은 여러 스레드가 안전하게 항목을 추가하거나 제거할 수 있도록 설계되었습니다.

특히 다음 동시성 컬렉션 타입들은 SpinLock, SpinWait 등과 같은 경량화된 동기화 메커니즘을 사용하여 잠금(Lock) 오버헤드를 최소화하고 성능을 극대화합니다. 이러한 기능들은 모두 .NET Framework 4에서 처음 도입되었습니다.

C# 주요 동시성(Concurrent) 컬렉션 종류

번호타입 및 설명
1

BlockingCollection<T>

모든 형식에 대해 경계(Bounding) 및 차단(Blocking) 기능을 제공하는 컬렉션입니다.

2

ConcurrentDictionary<TKey,TValue>

키-값(Key-Value) 쌍으로 구성된 딕셔너리의 스레드 안전 구현체입니다.

3

ConcurrentQueue<T>

FIFO(First-In, First-Out, 선입선출) 방식의 큐(Queue)를 스레드 안전하게 구현한 것입니다.

4

ConcurrentStack<T>

LIFO(Last-In, First-Out, 후입선출) 방식의 스택(Stack)을 스레드 안전하게 구현한 것입니다.

5

ConcurrentBag<T>

요소의 순서가 보장되지 않는 컬렉션을 스레드 안전하게 구현한 것입니다.

6

IProducerConsumerCollection<T>

BlockingCollection에서 사용되기 위해 해당 타입이 반드시 구현해야 하는 인터페이스입니다.


동시성 컬렉션 사용 시 장점

  • 명시적인 잠금 불필요: lock 문을 직접 작성하지 않아도 되므로 코드가 간결해집니다.
  • 경합 최소화: 세분화된 잠금(Fine-grained Locking)과 CAS(Compare-And-Swap) 연산을 활용해 병목 현상을 줄입니다.
  • 생산자-소비자 패턴 지원: BlockingCollection을 활용하면 멀티스레드 환경의 작업 큐를 손쉽게 구현할 수 있습니다.

멀티스레딩 또는 병렬 프로그래밍 환경에서 공유 데이터를 다룰 때는 일반 컬렉션 대신 위의 동시성 컬렉션을 사용하는 것이 안전성과 성능 모두에 유리합니다.