首页 >后端开发 >C++ >C# 的静态构造函数足以实现线程安全的单例吗?

C# 的静态构造函数足以实现线程安全的单例吗?

Patricia Arquette
Patricia Arquette原创
2025-01-16 11:36:58146浏览

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