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

C# Queue.IsSynchronized 속성 – 큐의 스레드 동기화 여부 확인하기

C#의 Queue.IsSynchronized 속성은 해당 Queue에 대한 접근이 동기화(synchronized)되어 있는지, 즉 스레드로부터 안전(thread-safe)한지를 나타내는 값을 가져오는 데 사용됩니다. 멀티스레드 환경에서 여러 스레드가 동시에 하나의 컬렉션에 접근할 때 이 속성을 활용하면 유용합니다.

구문

IsSynchronized 속성의 구문은 다음과 같습니다.

public virtual bool IsSynchronized { get; }

이 속성은 읽기 전용(get 전용)이며, Queue가 동기화되어 있으면 true, 그렇지 않으면 false를 반환합니다. 일반적인 방식으로 생성된 Queue 객체는 기본적으로 동기화되어 있지 않으므로 대부분 false를 반환합니다.

예제 1: 기본 Queue의 동기화 여부 확인

다음 예제에서는 숫자 요소를 담은 Queue를 만들고, IsSynchronized 속성 값이 어떻게 나오는지 확인해 보겠습니다.

using System;
using System.Collections;

public class Demo {
   public static void Main() {
      Queue queue = new Queue();
      queue.Enqueue(100);
      queue.Enqueue(200);
      queue.Enqueue(300);
      queue.Enqueue(400);
      queue.Enqueue(500);
      queue.Enqueue(600);
      queue.Enqueue(700);
      queue.Enqueue(800);
      queue.Enqueue(900);
      queue.Enqueue(1000);
      Console.WriteLine("Queue...");
      IEnumerator demoEnum = queue.GetEnumerator();
      while (demoEnum.MoveNext()) {
         Console.WriteLine(demoEnum.Current);
      }
      Console.WriteLine("Is Queue synchronized? = " + queue.IsSynchronized);
   }
}

출력 결과

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

Queue...
100
200
300
400
500
600
700
800
900
1000
Is Queue synchronized? = False

일반적인 방식으로 생성된 Queue는 동기화되어 있지 않기 때문에 IsSynchronized 속성이 False를 반환하는 것을 확인할 수 있습니다.

예제 2: Queue.Synchronized()로 동기화된 래퍼 만들기

다음 예제에서는 문자열 요소를 담은 Queue를 만들고, Queue.Synchronized() 메서드를 사용하여 스레드로부터 안전한 래퍼(wrapper)를 생성한 뒤, 원본 Queue와 래퍼 객체의 IsSynchronized 값을 비교해 보겠습니다.

using System;
using System.Collections;

public class Demo {
   public static void Main() {
      Queue queue = new Queue();
      queue.Enqueue("AB");
      queue.Enqueue("BC");
      queue.Enqueue("CD");
      queue.Enqueue("DE");
      queue.Enqueue("EF");
      queue.Enqueue("FG");
      queue.Enqueue("GH");
      queue.Enqueue("HI");
      Console.WriteLine("Queue...");
      IEnumerator demoEnum = queue.GetEnumerator();
      while (demoEnum.MoveNext()) {
         Console.WriteLine(demoEnum.Current);
      }
      Console.WriteLine("Is Queue synchronized? = " + queue.IsSynchronized);
      Queue queue2 = Queue.Synchronized(queue);
      Console.WriteLine("Is Queue synchronized now? = " + queue2.IsSynchronized);
   }
}

출력 결과

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

Queue...
AB
BC
CD
DE
EF
FG
GH
HI
Is Queue synchronized? = False
Is Queue synchronized now? = True

원본 Queue는 동기화되어 있지 않아 False를 반환하지만, Queue.Synchronized() 메서드로 감싼 queue2는 True를 반환하는 것을 볼 수 있습니다. 즉, Queue.Synchronized()는 기존 Queue를 감싸는 스레드 안전 래퍼를 생성해 줍니다.

정리

Queue.IsSynchronized 속성은 Queue가 스레드로부터 안전한지 여부를 간단히 확인할 수 있는 방법입니다. 멀티스레드 환경에서 공유 컬렉션을 사용할 때는 Queue.Synchronized() 메서드로 감싸거나, lock 문을 활용해 직접 동기화를 구현해야 합니다. 참고로 새로운 개발에서는 제네릭 컬렉션인 System.Collections.Generic.Queue<T> 사용이 권장되며, 이 경우에는 lock 등을 통해 직접 스레드 안전성을 확보해야 합니다.