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

C# Array.SyncRoot 속성이란? 역할과 사용법 완벽 정리

Array.SyncRoot 속성은 Array에 대한 접근을 동기화(synchronize)하는 데 사용할 수 있는 객체를 반환합니다. 이 속성은 ICollection 인터페이스에서 정의되며, 배열을 내부적으로 사용하는 클래스에서도 SyncRoot 속성을 활용해 자체적인 동기화 메커니즘을 구현할 수 있습니다.

왜 SyncRoot가 필요한가?

컬렉션을 순회(열거, enumeration)하는 작업은 기본적으로 스레드로부터 안전(thread-safe)하지 않습니다. 컬렉션이 동기화되어 있다고 하더라도, 다른 스레드가 여전히 해당 컬렉션을 수정할 수 있습니다. 이런 상황이 발생하면 결국 열거자(enumerator)가 예외를 던지게 됩니다.

이러한 문제를 방지하려면 컬렉션을 순회하는 동안 명시적으로 잠금(lock)을 걸어야 하며, 이때 잠금 대상 객체로 SyncRoot 속성을 사용합니다.

Array.SyncRoot 사용 예제

다음은 Array.SyncRoot 속성을 활용하는 방법을 보여주는 예제입니다.

using System;
using System.Collections.Generic;
using System.Linq;

class Program {
    static void Main() {
        Array arr = new int[] { 23, 11, 32, 18, 87 };
        lock(arr.SyncRoot) {
            foreach (Object val in arr)
                Console.WriteLine(val);
        }
    }
}

실행 결과

23
11
32
18
87

위 코드에서는 다음과 같이 배열에 잠금을 설정했습니다.

lock(arr.SyncRoot)

lock(arr.SyncRoot) 구문을 사용하면 foreach 루프가 배열을 순회하는 동안 다른 스레드가 해당 배열을 수정하지 못하도록 보장할 수 있습니다. 이처럼 SyncRoot 속성은 멀티스레드 환경에서 배열 데이터의 일관성을 유지하는 데 유용하게 활용됩니다.