用两个小样例来解释单例模式中的“双重锁定”
学习单例模式时,好多人都不太理解双重锁定。
学完后突然想到一个非常有趣的样例。
单例模式结构图:
代码:
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
用两个小样例来解释单例模式中的“双重锁定”相关推荐
- 用两个小例子来解释单例模式中的“双重锁定”
学习单例模式时,好多人都不太理解双重锁定.学完后突然想到一个很有趣的例子. 单例模式结构图: 代码: Singleton类 class Singleton{private static Singlet ...
- java 线程 单例_多线程单例模式
多线程单例模式 原文:https://blog.csdn.net/u011726005/article/details/82356538 1. 饿汉模式 使用饿汉模式实现单例是十分简单的,并且有效避免 ...
- python3的配置文件类单例实现_单例模式的几种实现方式及对比
来源:博客园 作者:为何不是梦 链接:https://www.cnblogs.com/ibigboy/p/11423613.html 所谓单例就是在系统中只有一个该类的实例. 单例模式的核心分以下三个 ...
- Spring DI模式 小样例
今儿跟同事讨论起来spring早期的,通过大篇幅xml的配置演变到今天annotation的过程,然后随手写了个小样例,感觉还不错,贴到这里留个纪念. 样例就是用JAVA API的方式, ...
- c语言中如何确保一个程序是单例的_c++单例模式
前言 在设计模式中,单例模式是最简单的一种.如何确保让一个资源在使用中只能实例化一次呢?如何确保在多线程环境下是线程安全的呢?本文将从最简单的单例到线程安全的单例一一讲解. 一.单线程环境 以下是最起 ...
- origin Pro 9.0画多条三维折线图(此处以两条为例)
origin Pro 9.0画多条三维折线图(此处以两条为例) 首先,建立两个New workbook,将需要的绘制的图分别放在book1 book2-如下图 选中book1 中的三维数据,操作如下图 ...
- Spring单例Bean与单例模式的区别
Spring单例Bean与单例模式的区别在于它们关联的环境不一样,单例模式是指在一个JVM进程中仅有一个实例,而Spring单例是指一个Spring Bean容器(ApplicationContext ...
- 空间坐标系以及空间两三维坐标系转换矩阵解释
空间坐标系以及空间两三维坐标系转换矩阵解释 因为工作的原因,需要进行不同坐标系的一个转换,在查阅了众多的网页之后,发现有用的没几个,而且众多都是抄的同一篇文章,而且都是罗列以下旋转的方式,几乎没有解释 ...
- 单例模式中,你不知道的事~~
单例模式可以说只要是一个合格的开发都会写,但是如果要深究,小小的单例模式可以牵扯到很多东西,比如:多线程是否安全?是否懒加载?性能等等.还有你知道几种单例模式的写法呢?如何防止反射破坏单例模式? 一. ...
最新文章
- 美轮美奂宇宙星空制作神器Spacescape
- The Road to Ryu: Hi Ryu
- [leetcode]687. Longest Univalue Path
- 简易 MVC框架 弃坑
- Test 2018-07-19 二中集训
- apt-get update : pulic key error
- 数据分析数据挖掘(二)
- Android Android.mk脚本结构
- 身份证号码15位转18位
- 更改计算机bios密码怎么办,计算机BIOS通用密码的修改
- 基于ATECLOUD云测试平台,数字万用表采集电阻测试方案
- 安装智能陈桥五笔时请小心
- dsp gpip操作 data set 和clc
- Spring boot出现java.awt.HeadlessException【已解决】
- Java经过的天数的计算公式_Java如何通过计算两个日期的时间差来算出天数
- ABAQUS软件实训(四):Mesh模块之六面体网格划分技巧
- 百练 2809 计算2的N次方
- 数电实验:数字时钟设计 (经验分享,仅供参考)
- Bootstrap实战 - 响应式布局
- Visual Studio 2008 官方破解版 正版cd key
热门文章
- android屏幕大小字体大小,Android字体大小自适应不同分辨率的解决办法
- HTML+CSS网页设计期末课程大作——体育排球(5页面)
- 使用 Learner Lab - 学生
- 苹果手机计算机的使用技巧,苹果手机6个使用小技巧,简单又实用,让你更好地了解你的iPhone...
- 苹果iphone手机哪些机型支持刷公交卡
- 秋冬季健康生活小常识
- react+amcharts5柱状图demo
- 安卓手机远程控制安卓手机
- java兔子繁殖总数_Java 兔子繁殖迭代问题
- win32画窗体背景