单例模式Singleton 代码

懒汉式单例:在第一次被引用时才会将自己实例化。

    class Singleton
    {
        private static Singleton instance;
        //程序运行时创建一个静态只读的进程辅助对象
        private static readonly object syncRoot = new object();
        //构造方法让其private,外界就无法使用new创建实例
        private Singleton()
        {
        }

        //获得本类实例的唯一全局访问点
        public static Singleton GetInstance()
        {
            /*
             * 先判断实例是否存在,不存在再加锁处理。这样不用让线程每次都加锁,而只是在实例未被创建的时候再加锁处理。同时也能保证多线程安全。
             * 这种做法被称Double-Check Locking(双重锁定)。
             * 两次判断instance==null是因为当同时有两个线程调用GetInstance()方法时,它们将可以通过第一重instance==null的判断,然后由于lock机制,
             * 这两个线程则只有一个进入,另一个在外排队等候,必须要其中的一个进入并出来后,另一个才能进入。而此时如果没有了第二重的instance是否为
             * null的判断,则第一个线程创建了实例,而第二个线程还是可以继续再创建新的实例,这就没有达到单例的目的。
             
*/
            if (instance == null)
            {
                //在同一个时刻,只有一个线程可以进入
                lock (syncRoot)
                {
                    //若实例不存在,则new一个新的实例,否则返回已有的实例
                    if (instance == null)
                    {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }

饿汉式代例:自己被加载时就将自己实例化。

    /// <summary>
    
/// 静态初始化方法
    
/// C#与公共语言运行库也提供了一种‘静态初始化’方法,这种方法不需要开发人员显式地编写线程安全代码,即可解决多线程环境下它是不安全的问题。
    
/// </summary>
    sealed class Singletom2
    {
        //sealed 阴止发派生,而派生可能会增加实例
        
//在第一次引用类的任何成员时创建实例。公共语言运行库负责处理变量初始化
        private static readonly Singletom2 instance = new Singletom2();
        private Singletom2() { }
        public static Singletom2 GetInstance()
        {
            return instance;
        }
    }

静态初始化方式提前占用系统资源,懒汉方式面临多线程访问安全性问题。从C#语言角度来讲,饿汉式的单例类已经足够满足我们的需求了。

原文地址:https://www.cnblogs.com/scottckt/p/2358725.html