单例模式(创建型)--计划生类?

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/aimin_com/article/details/80825198

引言:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

简介:为了保证我们只实例化一个对象,并且它可以提供一个访问该实例的方法,那我们就只能给上把锁。

这里写图片描述

/// <summary>
    /// Singleton类,定义一个GetInstance操作,允许客户访问它的唯一实例。GetInstance是一个静态方法,主要负责创建自己的唯一实例。
    /// </summary>
    class Singleton
    {
        //定义一个静态变量来保存类的实例
        private static Singleton instance;

        //定义私有构造函数,使外界不能创建该类实例
        private Singleton()
        {
        }


        //定义公有方法提供一个全局访问点
        public static Singleton GetInstance()
        {

            //如果实例不在,则new一个新的实例,否则返回已有的实例
            if (instance ==null )
            {
                instance = new Singleton();
            }

            return instance;
        }
    }

多线程时的单例:

class singletion
    {
        private static singletion instance; //定义一个标识确保线程同步
        private static readonly object syncRoot = new object();//当程序运行时创建一个静态只读的进程辅助对象
        private singletion()//定义私有构造函数,使外界不能创建该实例。
        {
        }

        public static singletion GetInstance()
        {
            //当第一个线程运行到这里时,此时会对syncRoot对象“枷锁”
            lock (syncRoot )
            {
                //如果实例不存在时则创建,否则直接返回
                if (instance==null )
                {
                    instance = new singletion();
                }
            }//lock语句运行完后(既线程运行完后)会对该对象解锁

            return instance;
        }
    }

为了我们不影响性能–双重锁定

//我们在GetInstance中重中添加一个if语句。
if (instance ==null)
            {
                lock (syncRoot )
                {
                    if (instance ==null )
                    {
                        instance = new singletion();
                    }
                }
            }

客户端代码


        //客户端代码
        static void Main(string[] args)
        {
            Singleton s1=Singleton.GetInstance ();
            Singleton s2 = Singleton.GetInstance();

            if (s1==s2 )
            {
                Console.WriteLine("两个对象是相同的实例");
            }
            Console.Read();

        }

lock:确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),知道该对象被释放。

猜你喜欢

转载自blog.csdn.net/aimin_com/article/details/80825198
今日推荐