首页 >后端开发 >C++ >带有静态构造函数的 C# 单例是线程安全的吗?

带有静态构造函数的 C# 单例是线程安全的吗?

DDD
DDD原创
2025-01-16 11:27:59850浏览

Is a C# Singleton with a Static Constructor Thread-Safe?

C# 静态构造函数中的单例线程安全问题

本文探讨了使用静态构造函数实现的 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