码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-05-21 13:32:00      阅读:250      评论:0      收藏:0      [点我收藏+]

标签:style   blog   class   c   code   tar   


       学习单例模式时,好多人都不太理解双重锁定。学完后突然想到一个很有趣的例子。

       单例模式结构图:

 bubuko.com,布布扣

        代码:

        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;
        }
    }
            客户端代码
    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:此处相当于代码中的客户端调用,singleton1为给老妈买衣服,single2为给媳妇买衣服】 

       我走进商店时,跟店员说,我想买衣服,店员说:“那你有200快钱吗?没钱就赶紧出去!”。【PS:此处为第一层判断】

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

       那媳妇的衣服怎么办?踱来踱去还想买另一件时,店员问我:“你有200块钱吗?没钱就赶紧出去!”于是我出去了。【PS:第二层判断,我没钱了,所以出去了,今晚回去肯定又得睡沙发了T_T…T_T…T_T


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

       打倒花心大萝卜!

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

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

         bubuko.com,布布扣


用两个小例子来解释单例模式中的“双重锁定”,布布扣,bubuko.com

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

标签:style   blog   class   c   code   tar   

原文地址:http://blog.csdn.net/huyuyang6688/article/details/26397949

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!