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

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

单例模式结构图:

代码:

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_T…T_T…T_T

转载于:https://www.cnblogs.com/liguangsunls/p/7080014.html

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

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

    学习单例模式时,好多人都不太理解双重锁定.学完后突然想到一个很有趣的例子. 单例模式结构图: 代码: Singleton类 class Singleton{private static Singlet ...

  2. java 线程 单例_多线程单例模式

    多线程单例模式 原文:https://blog.csdn.net/u011726005/article/details/82356538 1. 饿汉模式 使用饿汉模式实现单例是十分简单的,并且有效避免 ...

  3. python3的配置文件类单例实现_单例模式的几种实现方式及对比

    来源:博客园 作者:为何不是梦 链接:https://www.cnblogs.com/ibigboy/p/11423613.html 所谓单例就是在系统中只有一个该类的实例. 单例模式的核心分以下三个 ...

  4. Spring DI模式 小样例

           今儿跟同事讨论起来spring早期的,通过大篇幅xml的配置演变到今天annotation的过程,然后随手写了个小样例,感觉还不错,贴到这里留个纪念. 样例就是用JAVA API的方式, ...

  5. c语言中如何确保一个程序是单例的_c++单例模式

    前言 在设计模式中,单例模式是最简单的一种.如何确保让一个资源在使用中只能实例化一次呢?如何确保在多线程环境下是线程安全的呢?本文将从最简单的单例到线程安全的单例一一讲解. 一.单线程环境 以下是最起 ...

  6. origin Pro 9.0画多条三维折线图(此处以两条为例)

    origin Pro 9.0画多条三维折线图(此处以两条为例) 首先,建立两个New workbook,将需要的绘制的图分别放在book1 book2-如下图 选中book1 中的三维数据,操作如下图 ...

  7. Spring单例Bean与单例模式的区别

    Spring单例Bean与单例模式的区别在于它们关联的环境不一样,单例模式是指在一个JVM进程中仅有一个实例,而Spring单例是指一个Spring Bean容器(ApplicationContext ...

  8. 空间坐标系以及空间两三维坐标系转换矩阵解释

    空间坐标系以及空间两三维坐标系转换矩阵解释 因为工作的原因,需要进行不同坐标系的一个转换,在查阅了众多的网页之后,发现有用的没几个,而且众多都是抄的同一篇文章,而且都是罗列以下旋转的方式,几乎没有解释 ...

  9. 单例模式中,你不知道的事~~

    单例模式可以说只要是一个合格的开发都会写,但是如果要深究,小小的单例模式可以牵扯到很多东西,比如:多线程是否安全?是否懒加载?性能等等.还有你知道几种单例模式的写法呢?如何防止反射破坏单例模式? 一. ...

最新文章

  1. 美轮美奂宇宙星空制作神器Spacescape
  2. The Road to Ryu: Hi Ryu
  3. [leetcode]687. Longest Univalue Path
  4. 简易 MVC框架 弃坑
  5. Test 2018-07-19 二中集训
  6. apt-get update : pulic key error
  7. 数据分析数据挖掘(二)
  8. Android Android.mk脚本结构
  9. 身份证号码15位转18位
  10. 更改计算机bios密码怎么办,计算机BIOS通用密码的修改
  11. 基于ATECLOUD云测试平台,数字万用表采集电阻测试方案
  12. 安装智能陈桥五笔时请小心
  13. dsp gpip操作 data set 和clc
  14. Spring boot出现java.awt.HeadlessException【已解决】
  15. Java经过的天数的计算公式_Java如何通过计算两个日期的时间差来算出天数
  16. ABAQUS软件实训(四):Mesh模块之六面体网格划分技巧
  17. 百练 2809 计算2的N次方
  18. 数电实验:数字时钟设计 (经验分享,仅供参考)
  19. Bootstrap实战 - 响应式布局
  20. Visual Studio 2008 官方破解版 正版cd key

热门文章

  1. android屏幕大小字体大小,Android字体大小自适应不同分辨率的解决办法
  2. HTML+CSS网页设计期末课程大作——体育排球(5页面)
  3. 使用 Learner Lab - 学生
  4. 苹果手机计算机的使用技巧,苹果手机6个使用小技巧,简单又实用,让你更好地了解你的iPhone...
  5. 苹果iphone手机哪些机型支持刷公交卡
  6. 秋冬季健康生活小常识
  7. react+amcharts5柱状图demo
  8. 安卓手机远程控制安卓手机
  9. java兔子繁殖总数_Java 兔子繁殖迭代问题
  10. win32画窗体背景