>백엔드 개발 >C++ >C#의 정적 생성자는 스레드로부터 안전한 싱글톤 구현에 충분합니까?

C#의 정적 생성자는 스레드로부터 안전한 싱글톤 구현에 충분합니까?

Patricia Arquette
Patricia Arquette원래의
2025-01-16 11:36:58144검색

Is C#'s Static Constructor Sufficient for Thread-Safe Singleton Implementation?

싱글톤 모드에서 C# 정적 생성자의 스레드 안전성

싱글턴 패턴은 소프트웨어 개발의 일반적인 디자인 패턴으로, 애플리케이션 도메인에서 클래스의 인스턴스가 하나만 있도록 보장합니다. C#에서 정적 생성자는 싱글톤 구현의 인스턴스를 포함하여 클래스의 정적 멤버를 초기화하는 일을 담당합니다.

질문:

다음 C# 싱글톤 구현은 스레드로부터 안전합니까?

<code class="language-C#">public class Singleton
{
    private static Singleton instance;

    private Singleton() { }

    static Singleton()
    {
        instance = new Singleton();
    }

    public static Singleton Instance
    {
        get { return instance; }
    }
}</code>

정답:

예, 이 구현의 정적 생성자는 싱글톤 인스턴스의 초기 생성 중에 스레드 안전성을 보장합니다. Microsoft 설명서에 따르면 C#의 정적 생성자는 클래스 인스턴스가 생성되거나 정적 멤버에 액세스되기 전에 각 응용 프로그램 도메인에서 한 번만 실행되도록 보장됩니다.

그러나 이 스레드 안전성은 인스턴스의 초기 구성에만 적용된다는 점에 유의하는 것이 중요합니다. 이후 인스턴스 사용이 동기화된다는 보장은 없습니다. 완전한 스레드 안전성을 보장하려면 추가 동기화 메커니즘이 필요합니다.

스레드 동기화를 달성하는 한 가지 방법은 싱글톤 인스턴스에 대한 액세스를 제어하기 위해 정적 뮤텍스를 도입하는 것입니다.

<code class="language-C#">public class Singleton
{
    private static Singleton instance;
    private static System.Threading.Mutex mutex;

    private Singleton() { }

    static Singleton()
    {
        instance = new Singleton();
        mutex = new System.Threading.Mutex();
    }

    public static Singleton Acquire()
    {
        mutex.WaitOne();
        return instance;
    }

    public static void Release()
    {
        mutex.ReleaseMutex();
    }
}</code>

이 구현에서는 Acquire()에 대한 각 호출이 Release()에 대한 호출과 쌍을 이루어 한 번에 하나의 스레드만 싱글톤 인스턴스에 액세스할 수 있도록 해야 합니다. 이 접근 방식을 사용하면 초기 생성 시뿐만 아니라 인스턴스의 후속 사용 중에도 스레드 안전성이 달성됩니다.

위 내용은 C#의 정적 생성자는 스레드로부터 안전한 싱글톤 구현에 충분합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.