首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C#中一个好的线程安全单例通用模板模式是什么

在 C# 中,一个优秀的线程安全单例通用模板模式应遵循以下原则:

  1. 简单性
  2. 线程安全
  3. 单一实例
  4. 跨平台兼容性
  5. 隔离系统库与用户代码,以保持类库的整洁和可扩展性
  6. 避免双重检查锁定
代码语言:csharp
复制
using System;

public class Singleton<T> where T : class
{
    private static Lazy<T> _instance = new Lazy<T>(() =>
    {
        return new T();
    });

    public static T Instance => _instance.Value;

    private Singleton(T initialValue)
    {
        _instance.Value = initialValue;
    }

    ~Singleton()
    {
        _instance = null;
    }

    private static void CheckState()
    {
        if (typeof(T) == typeof(T) && _instance.IsValueCreated && (_instance.Value == _instance.Value))
        {
            throw new InvalidOperationException(String.Format("This type '{0}' has been registered multiple times in '{1}'.", typeof(T), typeof(Singleton<T>).AssemblyQualifiedName));
        }
    }
}

这个模式通过创建一个 Lazy<T> 静态变量 _instance,实现延迟初始化线程安全的单例类型 T。同时,通过定义一个构造函数和析构函数进行实例化及资源清理。通过 typeof(T) == typeof(T)_instance.IsValueCreated 来确保单例实例只创建一次。如果 T 类型及其 _instance 发生了更改或重新赋值,则在运行时发生 InvalidOperationException。当需要创建单例时,可以直接通过 Type T 获取唯一实例:

代码语言:csharp
复制
public class MyClass
{
    public MyClass()
    {
        SingletonFactory.Instance.Instance.StartMethod();
    }
}

public class SingletonFactory
{
    public static Singleton<MyClass> Instance { get; set; } = new Singleton<MyClass>();
}

该模式采用 Generic 关键字将普通类型转换为 Generic 类型,从而实现单一实例模式。此外,此模式的实例还可以从其他位置 (如数据库、文件、缓存等) 加载或创建。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券