单例模式-DoubleCheck
1.单例模式理解:是为了满足一些场景,一个对象只能创建一个实例对象的场景。
流程:
1.构造方法私有化,
2.声明对象 位静态
3.类方法返回实例化后的对象。
2.将单例模式分为两类 懒汉式和饿汉式:
懒汉式:特点在定义Singleton是就new
public class Singleton{private static Singleton singleton=new Singleton();private Singleton(){}public static Singleton newInstance(){return singleton;}
}
优点:简单,而且保证了线程安全,不管有多少个线程访问都只返回一个Singleton实例化对象
饿汉式单例模式:
1.普通
public class Singleton{private static Singleton singleton;private Singleton(){}public static Singleton newInstance(){if(singleton==null){ singleton=new Singleton();} return singleton; }
}
线程不安全:if判断确实可以保证只创建一个Singleton的实例对象。
但是在多线程并发场景下,由于没有加锁,多个线程可能都会进入到if中,那么这些线程就可以进行对象实例化操作产生多个对象。
if(singleton==null){ //多个线程进入id判断里面,singleton=new Singleton();}
双层检验锁单例模式:
public class Singleton{private static volatile Singleton singleton;private Singleton(){}public static Singleton newInstance(){if(singleton==null){//1synchronized(Singleton.class){//2if(singleton==null){singleton=new Singleton();}}}return singleton;//3}
}
按照上面的注释:来分析上面的代码:
1.在调用类方法newInstance的时候所有线程都可以进入//1中
2.多个线程中只有一个线程会拿到锁 进入同步代码块
3.拿到锁后要再次判断当前对象引用是否指向实例,因为在这个线程之前还会有别的线程拿到锁执行同步代码块。
到此流程基本结束:还有几个问题:
1.singleton为什么要用volatile修饰?
首先,synchronized 保证了只有一个线程对singleton进行实例操作,但是操作的对象是引用数据类型,换句话说该操作不是原子的。那么久可能发生指令重排。
正常情况:实例化对象的流程:1.在堆上开辟空间2.属性初始化3.将栈上空间指向堆。正常是1——>2——>3但是如果没有volatile关键字就可能发生指令重排:假设 1——>3——>2如果没有属性的话没有问题,一旦有了属性,假设现在有两个属性:name=“hahaha”,age=12;由于3步骤先执行,singleton已经不为空了,当有新的线程尝试获取Singleton实例,到了外层判断,直接返回。导致的结果就是,有能属性还没有来的及初始化就直接返回了,或者初始化了name..
2.为什么要有双重if判断:
内部的if是保证只有一个Singleton实例化对象被创建。
外层的if实际上是为了保证性能:
当Singleton已经被创建了,不进入内部,直接返回。可以把这种机制:当做一个限量发售的鞋,
把多线程当做在排队等待鞋的人。
当一个人进入后买了这双鞋 实际上已经没有这双鞋了
通常做法是在门口立一个牌子,鞋已经售空 人看到这个牌子就可以直接走了相当于外部的i f)。如果没有这个牌子,外面的人就不知道鞋已经卖完,还在不断排队进入鞋店,浪费资源
单例模式-DoubleCheck相关推荐
- 一个妹子的美团面试经历,历经 4 轮 2 小时,成功拿到 Offer
点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 来源:只爱羽毛球的程序媛 blog.csdn.net/csuliyajin2012/article/details/4 ...
- 【每日一念经】四轮面试,我如何拿到美团的offer?
微信改版,加星标不迷路! 四轮面试,我如何拿到美团的offer? 作者:只爱羽毛球的程序媛 美团我是在拉勾网上投的简历,之前也投过一次,简历都没通过海选,后来让学姐帮我改了一下简历,重新投另一个部门, ...
- 今晚我们通宵学习SpringCloud!涨姿势!
前言 不知道你们发现没有,在很多互联网公司基本上都是80后,90后居多,很少还有超过40岁的程序员.可能很多人心里都有一个疑问,那就是这些40多岁的程序员都干嘛去了呢?创业显然只是极少数的人,至于管理 ...
- 一个妹子的美团面试经历,成功拿到 Offer
美团,我是在拉勾网上投的简历,之前也投过一次,简历都没通过删选,后来让学姐帮我改了一下简历,重新投另一个部门,获得了面试机会.10月23日,中午HR打电话过来预约了下午4点半面试,说会在线写代码,让我 ...
- 美团技术四面经历,作者已拿到Offer!
作者:只爱羽毛球的程序媛 blog.csdn.net/csuliyajin2012/article/details/49430659 下面分享一位同学的美团面试经历: 美团我是在拉勾网上投的简历,之前 ...
- java数据分析库,威力加强版
美团技术一面20分钟 晚7点,因为想到下周一才面试,我刚准备出去打个羽毛球,北京的电话就来了.面试官各种抱歉,说开会拖延了. 1.自我介绍 说了很多遍了,很流畅捡重点介绍完. 2.问我数据结构算法好不 ...
- Java开发环境!java工程师薪资行情
美团技术一面20分钟 晚7点,因为想到下周一才面试,我刚准备出去打个羽毛球,北京的电话就来了.面试官各种抱歉,说开会拖延了. 1.自我介绍 说了很多遍了,很流畅捡重点介绍完. 2.问我数据结构算法好不 ...
- Java高级工程师必备知识!java入门书籍pdf
美团技术一面20分钟 晚7点,因为想到下周一才面试,我刚准备出去打个羽毛球,北京的电话就来了.面试官各种抱歉,说开会拖延了. 1.自我介绍 说了很多遍了,很流畅捡重点介绍完. 2.问我数据结构算法好不 ...
- 征服Java面试官!mysql索引树结构
美团技术一面20分钟 晚7点,因为想到下周一才面试,我刚准备出去打个羽毛球,北京的电话就来了.面试官各种抱歉,说开会拖延了. 1.自我介绍 说了很多遍了,很流畅捡重点介绍完. 2.问我数据结构算法好不 ...
最新文章
- linux shell shift命令 参数移动 简介
- 404. 左叶子之和
- 【Java数据结构】自己实现一个HahMap(实现其put, toString, get方法)
- javascript---001-运行原理01_前端三大技术_JS重要性_Atwood定律_JS应用_JS让人迷惑_TypeScript会取代JS吗_JS是一门编程语言_浏览器工作原理_浏览器内核
- Thinkphp5内核大型程序员交流博客系统源码
- 前端学习-css(一)
- java写 excel
- Spring MVC 入门指南(二):@RequestMapping用法详解
- saltstack return数据实时返回收集
- 数据挖掘-二手车价格预测 Task02:数据分析
- 云计算能给你带来什么?
- 数据存储与访问(SharedPreferencesDemo)
- 求助!ENDnoteX8+Word2016可关联,但总提示【该文档有宏】等bug
- 百度搜索跳过验证码_百度搜索是死是活?网友吵翻了天,你觉得呢
- SpringBoot+websocket 实现web聊天功能(单聊、保存消息)
- 分享5个Excel实用日常小技巧,不会的别说你会Excel!
- 计算机的计算密度相关,专家人才库数据----中国科学院计算技术研究所
- 常用工具 [ubuntu 图像编辑软件]
- Idea安装完成后打不开的问题
- pythonista官网-Pythonista中文文档