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)。
因此,单例实例的初始构造是线程安全的,这意味着它不需要锁定或空值测试。但是,这并不保证可以以同步方式使用单例对象。
为了实现对单例实例的任何使用的同步,可以使用几种方法。一种方法如下所示:
<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中文网其他相关文章!