单例模式是啥?
单例模式就是保证某个类在程序中只存在唯一一份实例对象。
单例模式的实现方式有哪些?
饿汉模式:正如字面,表示很饿,要赶紧吃饭;所以它在类加载的同时,就会创建实例对象。
懒汉模式:表示很懒,能不干就不干;所以它在类加载的同时不会创建实例对象;直到第一次去使用的时候,才会创建实例对象。
饿汉模式的实现

  • 优点:不存在线程安全问题
  • 缺点:资源浪费(当不使用实例时,但他又创建了)
/*** DataSource 单列模式* 饿汉模式:类加载的同时,创建实例*/
public class DataSourceSingleton {//1.创建一个私有的实例对象private  static  DataSourceSingleton dataSourceSingleton=new DataSourceSingleton();//2.私有的构造函数(防止外部new实例对象);否则就成多例了private  DataSourceSingleton(){}//3.对外提供这个实例对象public static DataSourceSingleton getInstance(){return dataSourceSingleton;}}

懒汉模式的实现

  • 优点:不浪费资源
  • 缺点:存在安全问题:当有两个线程同时访问getInstance()方法,都执行到了if(dataSourceSingleton1==null),此时,他们都会去new一个对象,则就不是单列模式了
/*** DataSource 单列模式* 懒汉模式:第一次使用的时候才去创建实例对象*/
public class DataSourceSingleton1 {//1.创建私有的属性private  static  DataSourceSingleton1 dataSourceSingleton1;//2.2.私有的构造函数(防止外部类new实例对象);否则就成多例了private  DataSourceSingleton1(){}//3.创建对外提供实例对象的方法public  static DataSourceSingleton1 getInstance(){if(dataSourceSingleton1==null){dataSourceSingleton1=new DataSourceSingleton1();}return dataSourceSingleton1;}}

为了保证它是单例模式,可以给其上锁synchronized

public  synchronized static DataSourceSingleton1 getInstance(){if(dataSourceSingleton1==null){dataSourceSingleton1=new DataSourceSingleton1();}return dataSourceSingleton1;}
  •  可但这样的话,线程就得一个一个去访问getInstance()方法,效率低
    

懒汉模式的改进

public class DataSourceSingleton2 {//1.用volatile 修饰 dataSourceSingleton2private  static  volatile  DataSourceSingleton2 dataSourceSingleton2;private DataSourceSingleton2(){}//2.使用双重if,降低锁的竞争频率public  static  DataSourceSingleton2 getInstance(){if(dataSourceSingleton2==null){synchronized (dataSourceSingleton2){if(dataSourceSingleton2==null){dataSourceSingleton2=new DataSourceSingleton2();}}}return dataSourceSingleton2;}
}

为啥要使用双重if?

  • 当有多个线程同时调用getInstance()方法时;假设线程1和线程2一起调用getInstance()方法;首先他们都判断到dataSourceSingleton2==null(第1次的if),
  • 然后他们都去竞争锁synchronized (dataSourceSingleton2),假设线程1竞争到了锁,线程1进行(第2次的if)就去创建了实例对象 ,然后释放了锁;
  • 这之后,线程2得到了锁,进行(第2次if)发现实例对象已经被创建过了,就不会再去new对象了,这样就保证了程序的单例模式。

为啥要用用volatile 修饰 dataSourceSingleton2?

volatile除了保证内存可见性,还可以防止指令重排序

首先了解一下dataSourceSingleton2=new DataSourceSingleton2()
,它由3部分组成:

  1. 给对象分配内存
  2. 初始化对象
  3. 设置对象到相应的内存地址上
  • 当程序先添加了线程1,让线程1执行,当线程1判断,上锁,再判断,然后执行到dataSourceSingleton2=new DataSourceSingleton2()时;

  • 但发生了指令重排序:变成 1、3、2;还没有执行2时,程序又添加了线程2,让线程2执行

  • 线程2首次判断dataSourceSingleton2==null时,发现对象已经被创建了,则会返回dataSourceSingleton2对象

  • 但此时虽然线程1创建了这个对象,但并没有初始化这个对象

  • 所以线程2得到的对象并不是完整的

Java——单例模式:饿汉、懒汉模式相关推荐

  1. java 单例模式 ---饿汉式懒汉式

    目录 单例设计模式 饿汉式 懒汉式 饿汉式vs懒汉式 结语 单例设计模式 所谓单例设计模式,就是采取一定的方法在整个软件系统中,对某个类只能存在一个对象实例 1.单例类只能有一个实例. 2.单例类必须 ...

  2. Singleton模式(单例模式) 饿汉式和懒汉式

    目的:整个应用中有且只有一个实例,所有指向该类型实例的引用都指向这个实例. 好比一个国家就只有一个皇帝(XXX),此时每个人叫的"皇帝"都是指叫的XXX本人; 常见单例模式类型: ...

  3. 【设计模式:单例模式】单例模式02:懒汉模式

    单例模式02:懒汉模式 正文开始@Assassin 目录: 单例模式02:懒汉模式 1. 回顾饿汉模式: 2. 懒汉模式细节: 3. 懒汉模式VS饿汉模式: 1. 回顾饿汉模式: 简单回顾一下单例模式 ...

  4. Java-Day12 面向对象的三大特征之封装、继承,单例模式(饿汉式、懒汉式)、方法重写 (覆盖)、注解 (annotation)、super关键字、对象的创建流程超详细

    目录 1. 面向对象的三大特征之封装 1.1 封装的含义 1.2 封装的目的 1.3 封装的优点 1.4 封装的实现过程 1.5 拓展知识:JavaBean 2. 面向对象的三大特征之继承 2.1 继 ...

  5. 单例模式的实现-懒汉模式【大话设计模式之爱你一万年:单例模式:我的女朋友只有你一个】

    2.单例模式的实现-懒汉模式 视频学习地址  -- <大话设计模式之爱你一万年>:https://dwz.cn/wqO0MAy7 这一节我们先来看看一种实现模式,懒汉模式,这也是这么中实现 ...

  6. 单例模式——饿汉式和懒汉式

    单例模式:一个类只允许存在唯一的对象,并提供它的访问方式 创建思路: 1.禁止在类的外部创建对象:私有化构造函数 2.在类的内部提供唯一的对象:静态成员变量 3.提供访问唯一对象的方法:静态成员函数 ...

  7. 大话设计模式之爱你一万年:第二章 创建型模式:单例模式:我的女朋友只有你一个:2.单例模式的实现-懒汉模式

    2.单例模式的实现-懒汉模式 视频学习地址  -- <大话设计模式之爱你一万年>:https://dwz.cn/wqO0MAy7 这一节我们先来看看一种实现模式,懒汉模式,这也是这么中实现 ...

  8. 单例模式饿汉式与懒汉式详解

    单例模式饿汉式与懒汉式详解 步骤: 私有构造方法,使得在类的外部不能调用此方法,限制产生多个对象 类初始化时,区分饿汉式与懒汉式的区别 对外部提供调用方法,将创建的对象返回,只能通过类来调用 饿汉式: ...

  9. 单例模式饿汉模式与懒汉模式

    目录 1.什么是单例模式 2.为什么需要单例模式? 3.如何实现单例模式 3.1饿汉方式 3.2懒汉模式 1.什么是单例模式 单例模式是一种设计模式,单例模式能保证某个类在程序中只存在唯一一份实例, ...

  10. 单例模式的原理/懒汉模式/饿汉模式以及不同版本的单例模式程序

    单例模式 单例模式定义 懒汉模式与饿汉模式 懒汉模式 饿汉模式 懒汉模式和饿汉模式的区别 懒汉模式的不同版本 版本一 版本二 版本三 版本四 单例模式定义 保证一个类仅有一个实例,并提供一个该实例的全 ...

最新文章

  1. java日期转化工具类
  2. 让Updatepanel中的控件触发整个页面Postback
  3. css选择器匹配没有属性x的元素[重复]
  4. OC基础 代理和协议
  5. Linux下通过进程名查看其占用端口
  6. JavaOne 2012:JavaOne技术主题演讲
  7. 新浪云python示例_Python Web框架Flask中使用新浪SAE云存储实例
  8. 在Windows下不使用密码远程登陆Linux
  9. 气候变化与 计算机网络,北京理工大学:气候变化综合评估模式研究获立项
  10. c# 多线程 执行事件 并发_阿里P9大牛对多线程并发问题的一些总结
  11. 浏览器内核信息和功能查看
  12. ES与分布式系统(一)
  13. 扩展欧几里得___追风少年的坐骑(2016swust信息院赛)
  14. C编译错误,运行错误以及常见问题。
  15. webpack 极简教程(前端自动化构建)
  16. Python的大数据之旅(1)---Anaconda与WingIDE安装
  17. 怎么用手机压缩图片?教给大家三种手机压缩图片方法
  18. png选项 无交错 交错_什么是交错内存?
  19. Android Q:调用系统相机拍照,并且获取图片
  20. 五行顺口溜_五行口诀

热门文章

  1. kali Linux 系统安装教程
  2. VirtualBox 安装教程
  3. HTML5 Audio时代的MIDI音乐文件播放 .
  4. android 铃声格式,安卓铃声是什么格式 常见的主流安卓铃声格式有哪些
  5. “互联网+”服务产业现状和个人信息保护特征分析
  6. markdown 在线解析 工具
  7. 如何备考软考中级-系统集成项目管理工程师
  8. 安装黑苹果系统前请看:macOS Mojave 的硬件兼容性列表
  9. 中仪股份管道机器人_中仪股份中仪股份cctv检测管道机器人X5-HSX5-HS
  10. 黑马程序员—银行调度系统