c#单例模式

 单例模式介绍

单例模式是一种常见的设计模式,用于确保一个类只有一个实例,并提供一个全局访问点来访问该实例。这种模式通常用于控制资源的访问,例如数据库连接、日志记录器等。

在单例模式中,类通常会提供一个静态方法或属性,用于获取单例实例。通常情况下,单例模式的实现包括以下几个关键要素:

  1. 私有化构造函数:通过私有化构造函数,阻止外部代码通过 new 关键字创建类的实例。

  2. 静态成员变量:类内部维护一个静态成员变量来保存单例实例。

  3. 静态访问方法:通过一个静态的方法或属性来允许外部代码获取单例实例。

在多线程环境下,需要特别注意单例模式的线程安全性。常见的实现方式包括使用双重检查锁定、静态构造函数、静态初始化器或者.NET Framework 提供的 Lazy 类型等。

项目代码单例模式实现

public class CogCommonMethod
    {
        private static CogCommonMethod cogCommonMethod;
        public static CogCommonMethod Instance()
        {
            lock (typeof(CogCommonMethod))
            {
                if (cogCommonMethod == null) { cogCommonMethod = new CogCommonMethod(); }
                return cogCommonMethod;
            }
        }
}

 

  1. 性能问题: 每次调用Instance方法时都会进行锁定操作,即使cogCommonMethod已经被实例化了。这会造成性能上的损耗,因为任何一个时刻只能有一个线程执行Instance方法。

  2. 实例化方式问题: 单例模式的实例化应该是在类加载的时候进行,而不是在第一次调用Instance方法时才进行。这种方式可能违反了预期的单例模式行为。

  3. 在 C# 中,如果没有显式声明构造函数,会自动生成一个公共的无参构造函数。这会导致违反单例模式的实现,因为其他代码可以通过调用构造函数来创建该类的多个实例。

单例模式常见实现

双重检查锁定:

双重检查锁定是一种延迟初始化技术,它通过在获取实例前后进行两次检查来确保线程安全地创建单例对象。首先检查实例是否已经被创建,如果没有,则使用同步块来确保只有一个线程能够创建实例。

这种方法的优点是在实例创建后,不会每次调用Instance属性时都进行同步操作,降低了性能开销。但是需要注意的是,在.NET Framework 4.0 之前,C#没有提供对双重检查锁定的完美支持,可能会导致一些潜在的问题。

public class Singleton
{
    private static volatile Singleton instance;
    private static object syncRoot = new object();

    private Singleton() {}

    public static Singleton Instance
    {
        get
        {
            if (instance == null)
            {
                lock (syncRoot)
                {
                    if (instance == null)
                        instance = new Singleton();
                }
            }
            return instance;
        }
    }
}

使用Lazy

Lazy类是.NET Framework提供的一种延迟初始化技术,它能够在多线程环境下安全地延迟初始化对象。它使用了内置的双重检查锁定机制,保证了线程安全性并且具备良好的性能。

这种方法非常方便,代码简洁,同时兼顾了线程安全和性能。在大多数情况下,推荐使用Lazy来实现单例模式。

public class Singleton
{
    private static readonly Lazy lazyInstance = new Lazy(() => new Singleton());

    private Singleton() { }

    public static Singleton Instance => lazyInstance.Value;
}

你可能感兴趣的:(c#,单例模式,开发语言)