C#设计模式:单例模式

    自从学程序设计以来,总是时不时的能够听得到设计模式这个词,在“小白”眼里,这个词就像是和框架一样,让人一听就蒙,也确实,对于这些设计模式,你不得不叹服它的巧妙灵活,用起来异常好用。我也是会时不时地去百度里面去看下一些大牛们写的关于设计模式的博客,对于一些常用的设计模式也是用得挺多,在这里写篇博客,来加深一下自己对这些模式的记忆,也学习一下那么比较陌生和不知道的设计模式。

    单例模式,这个应该算是设计模式中比较容易理解和使用的一个设计模式了。

    在写这篇博客之前,我专门在百度上搜索了一下设计模式,并复习了一遍,巧合得发现了一个C#的单例模式,写得很细心,也是深有感触,在这里分享一下。

    单例模式,就是有些类我们希望它只有一个实例,就像我们玩游戏的时候有社团,帮派,我们希望一个帮派里面只有一个团长,一个帮主一样。

简单的单例实现

    话不多说,先上代码,知道单例模式的人基本也都知道这么一个单例模式的构建。

    这段代码中,我们可以看到,有一个静态字段和属性,他的类型和我们要实现单例的类是一样的,这样,我们就可以通过类来直接获得到我们静态的SingleInstance类型对象,同时,我们还有一个私有的构造函数,也就是这个构造函数,让这个类外面不能实例化我们需要实现单例的类,使的我们只能调用这个类中的Instance来获取SingleInstance对象,也就完成了单例的实现。

    在单线程中,这确实是一个无可挑剔的单例,但是在多线程中,可能就不是这么回事了,由于我们CPU的执行是分配时间来执行一个线程,可能我们一个线程执行到if(instance == null)之后,直接跳到另一个线程,那么两个线程可能都判断if(instance == null)为真,也就创建了两个instance实例,也就不是我们想要的单例了。

   那么,上述问题怎么解决?这时候,我们就要想到多线程中的一个关键字——lock,我们在判断instance == null之前用一个空对象来锁住我们的判断,那么就使的只有一个线程在判断instance == null。

下面,上代码:

多线程中的单例实现

 修改的就是这段代码,申明了一个空对象locker,用于标记是否进行判断,一旦locker被锁住,那么久说明有其他线程在进行判断,等到程序其他对象return instance,运行完这段之后才开始判断instance是否为空,这样,就不会出现两个线程都认为instance为空的情况,也不会产生两个单例对象,从而实现了多线程中的单例。

    接下来,我们细看这段代码,每次都要对locker加锁,其实我们对locker锁了一次之后,也就油instance对象了,也就不用每次都去对locker加锁,那么也就增加了额外的开销,也损失了性能。那么,我们又要怎么解决这个问题呢。

    我们可以用双重锁定,这个用语言来描述还是有点费尽,偷偷懒,上代码,一清二楚。

     看着上面的代码,也就是多了一个if(instance == null)在最外层,从而先判断instance是否为空,如果为空,再锁定locker,实例化instance,这样,就完美解决了这个每次获取单例实例的时候都要锁住locker,只在第一次判断instance为空的时候才锁住。从而降低了内存开销。

   楼主也是抱着学习的态度来记录自己的学习成果,如有错误欢迎指正,同时欢迎各路英雄与楼主一起讨论研究。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容

  • 介绍 说到单例模式,大家第一反应应该就是——什么是单例模式?,从“单例”字面意思上理解为——一个类只有一个实例,所...
    Bob_Running阅读 224评论 0 1
  • 1 单例模式的动机 对于一个软件系统的某些类而言,我们无须创建多个实例。举个大家都熟知的例子——Windows任务...
    justCode_阅读 1,431评论 2 9
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • 单例模式(SingletonPattern)一般被认为是最简单、最易理解的设计模式,也因为它的简洁易懂,是项目中最...
    成热了阅读 4,222评论 4 34
  • 最近“友谊的小船说翻就翻”在网络上大热,寓意友谊经不起考验,说变就变,比如: 乘坐在友谊之船的两个好朋友,一个人突...
    怒放的叶子阅读 2,084评论 2 4