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

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

Mary-Kate Olsen
Mary-Kate Olsen원래의
2025-01-16 11:31:59245검색

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

C# 정적 생성자는 스레드로부터 안전합니까?

다음 싱글톤 구현을 고려해보세요.

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

    private Singleton() { }

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

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

이 구현은 스레드로부터 안전합니까?

정답:

정적 생성자(예제 참조)는 클래스의 인스턴스가 생성되기 전이나 정적 멤버에 액세스하기 전 애플리케이션 도메인에서 한 번만 실행되도록 보장됩니다(https://www.php .cn /link/362c6840e40a65edd557a108c219f8f0).

따라서 싱글톤 인스턴스의 초기 구성은 스레드로부터 안전합니다. 즉, 잠금이나 Null 테스트가 필요하지 않습니다. 그러나 이는 싱글톤 개체가 동기 방식으로 사용될 수 있다는 것을 보장하지 않습니다.

싱글톤 인스턴스 사용의 동기화를 달성하려면 여러 가지 방법을 사용할 수 있습니다. 한 가지 방법은 다음과 같습니다.

<code class="language-csharp">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;
    }

    // 每次调用Acquire()都需要调用Release()
    public static void Release()
    {
        mutex.ReleaseMutex();
    }
}</code>

이 구현에서는 싱글톤 인스턴스에 대한 액세스를 동기화하기 위해 정적 뮤텍스를 도입합니다. 적절한 동기화를 보장하려면 각 인스턴스의 획득(Acquire())을 해제(Release())해야 합니다.

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

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