• 用两个小样例来解释单例模式中的“双重锁定”



           学习单例模式时,好多人都不太理解双重锁定

    学完后突然想到一个非常有趣的样例。

           单例模式结构图:

     

            代码:

            Singleton类

        class Singleton
        {
            private static Singleton instance;
            private static readonly object syncRoot = new object();  //程序执行时创建一个静态仅仅读的进程辅助对象
            private Singleton() { }                 //用private修饰构造方法,防止外界利用new创建此类实例
            public static Singleton GetInstance()
            {
                if (instance == null)               //若instance对象为null,则继续
                {
                    lock (syncRoot)                 //↓↓↓↓在同一时刻加了锁的这部分程序仅仅有一个线程能够进入↓↓↓↓
                    {
                        if (instance == null)//假设instance对象为null,则为它分配实例
                        {
                            instance = new Singleton();
                        }
                    }                               //↑↑↑↑在同一时刻加了锁的这部分程序仅仅有一个线程能够进入↑↑↑↑
                } 
                return instance;
            }
        }
                client代码
        static void Main(string[] args)
        {
            Singleton singleton1=Singleton.GetInstance();
            Singleton singleton2=Singleton.GetInstance();
            //……
        }
                说明:

          《大话设计模式》中,小菜问道:“我在外面已经推断了instance实例是否存在。为什么在lock里面还要做一次instance实例是否存在的推断呢?”

           大鸟是这么回答的:当instance为null而且同一时候有两个线程调用GetInstance方法时。他们将都能够通过第一重instance==null的推断。

    然后因为lock机制。这两个线程则仅仅有一个进入。另外一个在外排队等候,必需要当中的一个进入并出来后,还有一个才干进入,而此时假设没有了第二重的instance是否为null的推断,则第一个线程创建了实例,第二个线程还是能够继续再创建新的实例,这就没有达到单例的目的。


           假设认为大鸟的话不太好理解。能够看看这个样例:

           ——假设我和你妈掉进河里,你先救谁?——当然救我妈。宁愿睡沙发!

           在一个200元时装店(顾名思义,全部的衣服都是200元),妈妈看中一件200元的衣服,媳妇也看中一件200元的衣服。但我仅仅有200块钱(所以仅仅能买一件),虽然如此,作为儿子和丈夫的我也得掏钱啊

    【PS:此处相当于代码中的client调用,singleton1为给老妈买衣服,singleton2为给媳妇买衣服】 

           我走进商店时,跟店员说。我想买衣服,店员说:“那你有200快钱吗?没钱就赶紧出去!

    ”。【PS:此处为第一层推断】

           经过深思熟虑,百善孝为先,我买了老妈看中的那件衣服。【给老妈买衣服的线程成功运行。给媳妇买衣服的线程被锁在外面】

           那媳妇的衣服怎么办?踱来踱去还想买还有一件时。店员问我:“你有200块钱吗?没钱就赶紧出去!

    ”于是我出去了。

    【PS:第二层推断,我没钱了,所以出去了,今晚回去肯定又得睡沙发了T_T…T_T…T_T


           讲完这个故事,突然又想到一件事,就再啰嗦几句,爆爆料。

           打倒花心大萝卜!

               大家都听说过Darry Ring钻戒。它的宗旨是“用一生给你一个唯一的承诺”,即一个男人一生仅仅能凭身份证买一个。

           话说几十年前看上一位美丽的女子。为了表达爱慕,为她买了一枚Darry Ring。女子被感动,顺利追到手,当时还纳闷为什么买钻戒还要填写身份证号,只是也没在意。前几天又看上一女子,于是花心的我想脚踏两条船。想再买一枚Darry Ring追求之。麻烦来了。买钻戒的时候,工作人员告诉我说,我已经买过Darry Ring的戒指。而一个男人一生仅仅能凭身份证买一枚……我去。什么鸟规定!于是忍痛挥泪和女神说拜拜T_TT_TT_T

             


  • 相关阅读:
    医院信息化管理系统(HIS)与医院网络时钟系统
    实验吧—Web——WP之 上传绕过
    实验吧—Web——WP之 猫抓老鼠
    实验吧—Web——WP之 因缺思汀的绕过
    实验吧—Web——WP之 貌似有点难
    实验吧—Web——WP之 Forms
    实验吧—隐写术——WP之 我喜欢培根
    实验吧—隐写术——WP之 Fair-Play
    实验吧—隐写术——WP之 奇妙的音乐
    实验吧—隐写术——WP之 男神一般都很低调很低调的!!
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/7080014.html
Copyright © 2020-2023  润新知