前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用两个小例子来解释单例模式中的“双重锁定”

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

作者头像
DannyHoo
发布2018-09-13 11:27:40
1K0
发布2018-09-13 11:27:40
举报
文章被收录于专栏:Danny的专栏

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1336872

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

       单例模式结构图:

        代码:

        Singleton类

代码语言:javascript
复制
    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;
        }
    }

客户端代码

代码语言:javascript
复制
    static void Main(string[] args)
    {
        Singleton singleton1=Singleton.GetInstance();
        Singleton singleton2=Singleton.GetInstance();
        //……
    }

说明:

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

       大鸟是这么回答的:当instance为null并且同时有两个线程调用GetInstance方法时,他们将都可以通过第一重instance==null的判断。然后由于lock机制,这两个线程则只有一个进入,另外一个在外排队等候,必须要其中的一个进入并出来后,另一个才能进入,而此时如果没有了第二重的instance是否为null的判断,则第一个线程创建了实例,第二个线程还是可以继续再创建新的实例,这就没有达到单例的目的。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014年05月21日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档