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相关推荐

  1. 一个妹子的美团面试经历,历经 4 轮 2 小时,成功拿到 Offer

    点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 来源:只爱羽毛球的程序媛 blog.csdn.net/csuliyajin2012/article/details/4 ...

  2. 【每日一念经】四轮面试,我如何拿到美团的offer?

    微信改版,加星标不迷路! 四轮面试,我如何拿到美团的offer? 作者:只爱羽毛球的程序媛 美团我是在拉勾网上投的简历,之前也投过一次,简历都没通过海选,后来让学姐帮我改了一下简历,重新投另一个部门, ...

  3. 今晚我们通宵学习SpringCloud!涨姿势!

    前言 不知道你们发现没有,在很多互联网公司基本上都是80后,90后居多,很少还有超过40岁的程序员.可能很多人心里都有一个疑问,那就是这些40多岁的程序员都干嘛去了呢?创业显然只是极少数的人,至于管理 ...

  4. 一个妹子的美团面试经历,成功拿到 Offer

    美团,我是在拉勾网上投的简历,之前也投过一次,简历都没通过删选,后来让学姐帮我改了一下简历,重新投另一个部门,获得了面试机会.10月23日,中午HR打电话过来预约了下午4点半面试,说会在线写代码,让我 ...

  5. 美团技术四面经历,作者已拿到Offer!

    作者:只爱羽毛球的程序媛 blog.csdn.net/csuliyajin2012/article/details/49430659 下面分享一位同学的美团面试经历: 美团我是在拉勾网上投的简历,之前 ...

  6. java数据分析库,威力加强版

    美团技术一面20分钟 晚7点,因为想到下周一才面试,我刚准备出去打个羽毛球,北京的电话就来了.面试官各种抱歉,说开会拖延了. 1.自我介绍 说了很多遍了,很流畅捡重点介绍完. 2.问我数据结构算法好不 ...

  7. Java开发环境!java工程师薪资行情

    美团技术一面20分钟 晚7点,因为想到下周一才面试,我刚准备出去打个羽毛球,北京的电话就来了.面试官各种抱歉,说开会拖延了. 1.自我介绍 说了很多遍了,很流畅捡重点介绍完. 2.问我数据结构算法好不 ...

  8. Java高级工程师必备知识!java入门书籍pdf

    美团技术一面20分钟 晚7点,因为想到下周一才面试,我刚准备出去打个羽毛球,北京的电话就来了.面试官各种抱歉,说开会拖延了. 1.自我介绍 说了很多遍了,很流畅捡重点介绍完. 2.问我数据结构算法好不 ...

  9. 征服Java面试官!mysql索引树结构

    美团技术一面20分钟 晚7点,因为想到下周一才面试,我刚准备出去打个羽毛球,北京的电话就来了.面试官各种抱歉,说开会拖延了. 1.自我介绍 说了很多遍了,很流畅捡重点介绍完. 2.问我数据结构算法好不 ...

最新文章

  1. linux shell shift命令 参数移动 简介
  2. 404. 左叶子之和
  3. 【Java数据结构】自己实现一个HahMap(实现其put, toString, get方法)
  4. javascript---001-运行原理01_前端三大技术_JS重要性_Atwood定律_JS应用_JS让人迷惑_TypeScript会取代JS吗_JS是一门编程语言_浏览器工作原理_浏览器内核
  5. Thinkphp5内核大型程序员交流博客系统源码
  6. 前端学习-css(一)
  7. java写 excel
  8. Spring MVC 入门指南(二):@RequestMapping用法详解
  9. saltstack return数据实时返回收集
  10. 数据挖掘-二手车价格预测 Task02:数据分析
  11. 云计算能给你带来什么?
  12. 数据存储与访问(SharedPreferencesDemo)
  13. 求助!ENDnoteX8+Word2016可关联,但总提示【该文档有宏】等bug
  14. 百度搜索跳过验证码_百度搜索是死是活?网友吵翻了天,你觉得呢
  15. SpringBoot+websocket 实现web聊天功能(单聊、保存消息)
  16. 分享5个Excel实用日常小技巧,不会的别说你会Excel!
  17. 计算机的计算密度相关,专家人才库数据----中国科学院计算技术研究所
  18. 常用工具 [ubuntu 图像编辑软件]
  19. Idea安装完成后打不开的问题
  20. pythonista官网-Pythonista中文文档

热门文章

  1. DESFire 学习之AUTH
  2. pytorch之torch.gather方法
  3. srm555 div2
  4. 【Homeassistant 与Passive Infrared Sensor被动红外传感器握手】
  5. 4、判断一个年份是否为闰年。(闰年即满足以下两条件的年份:其一:能被4整除但不能被100整除;其二:能被400带除)
  6. 基于FPGA的一维卷积神经网络CNN的实现(一)框架
  7. 我眼中的匈牙利命名法
  8. 2018函授英语计算机统考,大学英语b网络统考
  9. 创新是企业发展的动力源
  10. php基础语法——输出语句