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

C#에서 ListDictionary가 동기화되어 있는지 확인하는 방법

C#에서 ListDictionary가 동기화(Synchronized)되어 있는지 확인하려면 IsSynchronized 속성을 사용하면 됩니다. 이 속성은 해당 컬렉션에 대한 접근이 스레드로부터 안전하게 동기화되어 있는지 여부를 나타내며, 동기화되어 있으면 true, 그렇지 않으면 false를 반환합니다.

기본적으로 ListDictionary는 동기화되어 있지 않습니다. 멀티스레드 환경에서 안전하게 사용하려면 별도의 동기화 처리가 필요합니다.


예제 1

다음은 ListDictionary의 동기화 여부를 확인하는 예제입니다.

using System;
using System.Collections;
using System.Collections.Specialized;
public class Demo {
   public static void Main(){
      ListDictionary dict = new ListDictionary();
      dict.Add("1", "SUV");
      dict.Add("2", "Sedan");
      dict.Add("3", "Utility Vehicle");
      dict.Add("4", "Compact Car");
      dict.Add("5", "SUV");
      dict.Add("6", "Sedan");
      dict.Add("7", "Utility Vehicle");
      dict.Add("8", "Compact Car");
      dict.Add("9", "Crossover");
      dict.Add("10", "Electric Car");
      Console.WriteLine("ListDictionary elements...");
      foreach(DictionaryEntry d in dict){
         Console.WriteLine(d.Key + " " + d.Value);
      }
      Console.WriteLine("
Is the ListDictionary having fixed size? = "+dict.IsFixedSize);
      Console.WriteLine("If ListDictionary read-only? = "+dict.IsReadOnly);
      Console.WriteLine("Is ListDictionary synchronized = "+dict.IsSynchronized);
      Console.WriteLine("The ListDictionary has the key K? = "+dict.Contains("K"));
      Console.WriteLine("The ListDictionary has the key 9? = "+dict.Contains("9"));
   }
}

출력 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

ListDictionary elements...
1 SUV
2 Sedan
3 Utility Vehicle
4 Compact Car
5 SUV
6 Sedan
7 Utility Vehicle
8 Compact Car
9 Crossover
10 Electric Car
Is the ListDictionary having fixed size? = False
If ListDictionary read-only? = False
Is ListDictionary synchronized = False The ListDictionary has the key K? = False
The ListDictionary has the key 9? = True

출력 결과에서 확인할 수 있듯이, IsSynchronized 속성은 False를 반환합니다. 즉, 기본 상태의 ListDictionary는 스레드 동기화가 적용되어 있지 않습니다. 또한 고정 크기 여부(IsFixedSize)와 읽기 전용 여부(IsReadOnly)도 모두 False로 표시됩니다.


예제 2

이번에는 두 개의 ListDictionary 객체를 생성하고, 열거자(Enumerator)를 활용해 요소를 출력한 뒤 동기화 여부를 확인하는 다른 예제를 살펴보겠습니다.

using System;
using System.Collections;
using System.Collections.Specialized;
public class Demo {
   public static void Main(){
      ListDictionary dict1 = new ListDictionary();
      dict1.Add("A", "Books");
      dict1.Add("B", "Electronics");
      dict1.Add("C", "Smart Wearables");
      dict1.Add("D", "Pet Supplies");
      dict1.Add("E", "Clothing");
      dict1.Add("F", "Footwear");
      Console.WriteLine("ListDictionary1 elements...");
      foreach(DictionaryEntry d in dict1){
         Console.WriteLine(d.Key + " " + d.Value);
      }
      ListDictionary dict2 = new ListDictionary();
      dict2.Add("1", "One");
      dict2.Add("2", "Two");
      dict2.Add("3", "Three");
      dict2.Add("4", "Four");
      dict2.Add("5", "Five");
      dict2.Add("6", "Six");
      Console.WriteLine("
ListDictionary2 key-value pairs...");
      IDictionaryEnumerator demoEnum = dict2.GetEnumerator();
      while (demoEnum.MoveNext())
         Console.WriteLine("Key = " + demoEnum.Key + ", Value = " + demoEnum.Value);
      Console.WriteLine("Is the ListDictionary having fixed size? = "+dict2.IsFixedSize);
      Console.WriteLine("If ListDictionary read-only? = "+dict2.IsReadOnly);
      Console.WriteLine("Is ListDictionary synchronized = "+dict2.IsSynchronized);
      Console.WriteLine("The ListDictionary has the key 5? = "+dict2.Contains("5"));
   }
}

출력 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

ListDictionary1 elements...
A Books
B Electronics
C Smart Wearables
D Pet Supplies
E Clothing
F Footwear

ListDictionary2 key-value pairs...
Key = 1, Value = One
Key = 2, Value = Two
Key = 3, Value = Three
Key = 4, Value = Four
Key = 5, Value = Five
Key = 6, Value = Six
Is the ListDictionary having fixed size? = False
If ListDictionary read-only? = False
Is ListDictionary synchronized = False The ListDictionary has the key 5? = True

정리

ListDictionary의 IsSynchronized 속성은 항상 false를 반환하므로, 멀티스레드 환경에서 안전하게 사용하려면 SyncRoot 속성을 활용해 직접 잠금(lock)을 구현하거나, 스레드 안전성이 보장되는 다른 컬렉션(예: Hashtable의 Synchronized 메서드로 생성된 인스턴스)을 사용하는 것이 좋습니다. 또한 Contains 메서드를 사용하면 특정 키의 존재 여부를 간편하게 확인할 수 있습니다.