본문 바로가기

C#

C# 동시 컬렉션(Concurrent Collections) 활용하기

멀티스레드 환경에서 안전하게 컬렉션을 다루기 위해서는 동시 컬렉션을 사용하는 것이 필수입니다. C#에서는 System.Collections.Concurrent 네임스페이스 아래 여러 동시 컬렉션을 제공해, 락 없이 효율적인 동시성을 지원합니다.

1. 주요 동시 컬렉션 종류

대표적인 동시 컬렉션에는 다음이 있습니다:

  • ConcurrentDictionary<TKey, TValue>: 스레드 안전한 키-값 저장소
  • ConcurrentQueue<T>: 스레드 안전한 FIFO 큐
  • ConcurrentStack<T>: 스레드 안전한 스택
  • ConcurrentBag<T>: 순서에 무관한 스레드 안전한 컬렉션

2. ConcurrentDictionary 사용 예

ConcurrentDictionary는 여러 스레드가 동시에 읽기, 쓰기 작업을 할 때 효과적입니다.

using System;
using System.Collections.Concurrent;
using System.Threading.Tasks;

class Program
{
    static void Main()
    {
        var dict = new ConcurrentDictionary<int, string>();

        Parallel.For(0, 1000, i =>
        {
            dict.TryAdd(i, $"Value{i}");
        });

        Console.WriteLine($"지금까지 추가된 항목 수: {dict.Count}");
    }
}

3. 언제 동시 컬렉션을 사용해야 할까?

멀티스레드 상황에서 일반 컬렉션(List, Dictionary 등)을 사용하면 데이터 손상과 예외가 발생할 수 있습니다. 이런 상황에서는 굳이 복잡한 락(lock) 코드를 작성하지 말고, 동시 컬렉션을 사용하는 것이 안전하고 간편합니다.

동시 컬렉션은 내부에서 효율적인 락 분할이나 무락(lock-free) 알고리즘을 사용해 성능도 좋다는 점이 장점입니다.