单例模式 简单分析

  /// <summary>
    /// test单例模式第一种 不考虑高并发的模式
    /// </summary>
    public class singleton
    {
        //静态私有的字段为什么要static呢  因为为了被公开的方法GetInstance调用 为什么公开的方法GetInstance要被生命成static呢 因为如果不是静态的  外部根本就调用不到了这个方法  因为外部不能new 只能根据类名称调用里面的公开方法GetInstance
        private static singleton single;
        //私有的构造方法确保用户不能new出实例
        private singleton()
        { }
        public static singleton GetInstance()
        {
            //首先判断是否有这个实例  如果没有 new一个新的实例 
            if (single == null)
            {
                single = new singleton();//为什么这里能new  因为构造函数是私有的private的
            }
            //结果放回
            return single;
        }
    }

    //上面的这个虽然能够解决类只能实例化一个对象的问题 但是当用户量访问量过大时  会出现创建出多个对象的问题,例如A过来以后 正在创建实例 此时实例还没有创建成功,B也过来创建实例  一看实例还是null  于是B创建了一个实例  此时A也创建出了实例  解决方法是加上lock锁  下面是lock锁的例子

    public class singletonTwo
    {
        //静态的私有的字段
        private static singletonTwo ST;
        //lock锁使用的私有静态对象
        private static object _Object = new object();
        //私有的构造方法 确保类的外部不能new
        private singletonTwo()
        { }
        //对外公开的实例化的静态方法
        public static singletonTwo GetInstance()
        {
            //如果实例为空 在if的内层加lock锁  如果不为空 直接返回实例
            if (ST == null)//这个循环主要是为了节省开销 如果每次每次进来都加把锁 再进行查看实例是否存在浪费资源 如果实例已经存在了 就不在需要锁机制  直接返回实例
            {
                lock (_Object)//枷锁
                {
                    if (ST == null)
                    {
                        ST = new singletonTwo();
                    }
                }

            }
            return ST;
        }

    }

  

原文地址:https://www.cnblogs.com/lierjie/p/3841072.html