0Pricing
C# Academy · 강의

ConcurrentDictionary<T>와 변경 불가능한 컬렉션

스레드 안전한 업데이트에는 ConcurrentDictionary 를 사용하고, 읽기 전용 뷰와 복사 후 쓰기 같은 간단한 변경 불가능성 접근법을 배웁니다.

ConcurrentDictionary<T>와 변경 불가능한 컬렉션은(는) CoddyKit의 무료 C# Academy 강의입니다. 이것은 3개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C# Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C# Academy 강의에는 총 3개의 강의가 포함되어 있습니다.

스레드 안전성과 불변성 기초

오늘 배울 내용:

  • ConcurrentDictionary<TKey,TValue>: 여러 스레드에서 안전하게 업데이트
  • 읽기 전용 뷰와 진정한 불변성의 차이
  • 간단한 안전성을 위한 쓰기 시 복사 개념

원자적 연산: GetOrAdd/AddOrUpdate

원자적 연산에는 GetOrAdd와 AddOrUpdate를 사용하고, 안전하게 읽을 때는 TryGetValue를 사용합니다.

using System;
using System.Collections.Concurrent;

public class Program
{
  public static void Main(string[] args)
  {
    ConcurrentDictionary<string, int> counts = new ConcurrentDictionary<string, int>();

    // Add if missing
    int a = counts.GetOrAdd("apple", 0); // 0
    // Increment safely
    int newVal = counts.AddOrUpdate("apple", 1, (key, oldValue) => oldValue + 1);

    Console.WriteLine("apple was " + a + ", now " + newVal);

    int value;
    bool ok = counts.TryGetValue("apple", out value);
    Console.WriteLine("Has apple? " + ok + " -> " + value);
  }
}

경쟁 상태 없는 증가 아이디어

AddOrUpdate는 원자적으로 업데이트하여 고전적인 읽기-수정-쓰기 경쟁 상태를 방지합니다.

using System;
using System.Collections.Concurrent;

public class Program
{
  static int Inc(int oldValue) { return oldValue + 1; }

  public static void Main(string[] args)
  {
    ConcurrentDictionary<string, int> clicks = new ConcurrentDictionary<string, int>();

    // Simulate multiple updates
    for (int i = 0; i < 5; i++)
    {
      clicks.AddOrUpdate("home", 1, delegate(string k, int v) { return Inc(v); });
    }

    Console.WriteLine("home clicks = " + clicks["home"]); // 5 (starting at 1 then +4)
  }
}

읽기 전용 뷰(불변 아님)

AsReadOnly는 읽기 전용 뷰를 반환하지만, 진정으로 불변인 컬렉션을 반환하는 것은 아닙니다. 원본의 변경 사항은 뷰에 나타납니다.

using System;
using System.Collections.Generic;

public class Program
{
  public static void Main(string[] args)
  {
    List<string> items = new List<string>(new string[] { "A", "B" });
    var ro = items.AsReadOnly(); // ReadOnlyCollection<string>

    foreach (string s in ro) Console.WriteLine(s); // A, B

    // ro.Add("C"); // not available: read-only view has no Add

    // But changing the source list reflects in the view:
    items.Add("C");
    Console.WriteLine("After source change:");
    foreach (string s in ro) Console.WriteLine(s); // A, B, C
  }
}

쓰기 시 복사 스냅샷

쓰기 시 복사: 변경할 때 새 목록을 반환합니다. 이전 목록을 계속 보유한 호출자는 안정적인 스냅샷을 확인할 수 있습니다.

using System;
using System.Collections.Generic;

public class Program
{
  static List<int> AddWithoutTouchingOriginal(List<int> original, int item)
  {
    // create a copy and modify the copy
    List<int> copy = new List<int>(original);
    copy.Add(item);
    return copy;
  }

  public static void Main(string[] args)
  {
    List<int> a = new List<int>(new int[] { 1, 2 });
    List<int> b = AddWithoutTouchingOriginal(a, 3);

    Console.WriteLine("Original:");
    foreach (int x in a) Console.WriteLine(x); // 1,2

    Console.WriteLine("Copy:");
    foreach (int x in b) Console.WriteLine(x); // 1,2,3
  }
}

팁과 절충점

팁:

  • 공유 카운터와 캐시에는 ConcurrentDictionary를 사용합니다.
  • AsReadOnly는 사용하는 쪽에서 실수로 변경하는 것을 방지합니다.
  • 안정적인 뷰가 필요하면 수정하기 전에 목록을 복사합니다.
  • 진정한 불변 컬렉션은 System.Collections.Immutable 패키지에 있습니다. 여기서는 코드를 독립적으로 유지하기 위해 사용하지 않습니다.

스레드 안전 사전 선택

간단한 확인: 외부 잠금 없이 스레드 안전하게 추가와 업데이트를 지원하는 컬렉션은 무엇일까요?

요약

요약: 동시 업데이트에는 ConcurrentDictionary를 사용합니다. 호출하는 쪽에는 읽기 전용 뷰를 공개하고, 안정적인 스냅샷이 필요하면 쓰기 시 복사를 사용하세요.

자주 묻는 질문

“ConcurrentDictionary<T>와 변경 불가능한 컬렉션” 강의는 무료인가요?

네 — “ConcurrentDictionary<T>와 변경 불가능한 컬렉션” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C# Academy 강의 전체를 잠금 해제할 수 있습니다. C# Academy 강의에는 총 3개의 강의가 포함되어 있습니다.

“ConcurrentDictionary<T>와 변경 불가능한 컬렉션”에서 뭘 배우나요?

스레드 안전한 업데이트에는 ConcurrentDictionary 를 사용하고, 읽기 전용 뷰와 복사 후 쓰기 같은 간단한 변경 불가능성 접근법을 배웁니다. 브라우저에서 직접 실행하는 실습 코드로 C# Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

C# Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 C# Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 3개 중 2번째 강의입니다.

“ConcurrentDictionary<T>와 변경 불가능한 컬렉션” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 C# Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 C# Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. HashSet , SortedSet , Queue , Stack
  2. ConcurrentDictionary 와 변경 불가능한 컬렉션
  3. 같음과 해싱(값과 참조)
← C# Academy(으)로 돌아가기