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中文网其他相关文章!