所谓单例模式就是为了确保类在内存中只有一个对象,之所以会出现单例模式是因为,单例模式在系统内存中只存在一个对象,可以节约资源。当我们获得对象的时候,每次获得的都是同一个,那么我们可以先创建好一个实例,然后写一个get方法,每次创建的时候,通过get方法获取该实例,那么就达到了单例效果,需要注意的是,我们要私有构造方法,以免外面new对象。

public class Singleton {public static Singleton instance = new Singleton();private Singleton(){}public static Singleton getInstance() {return instance;}
}

这种写法,习惯上称之为饿汉式,原因很简单,因为在获取对象之前都创建好了,感觉“很饿”,这样其实不好,因为我都没有用到这个对象,你都创建了,多浪费呀,说的也是,于是我们改为,当用到的时候,我们判断instance是否为null,如果为null,我们就创建,否则就直接return。

public class Singleton {public static Singleton instance;private Singleton(){}public static Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}

这种方式是等用到了才去创建,给人的感觉是很懒,所以又叫懒汉式,仔细看看这种写法,其实存在线程安全问题,当有多线程调用getInstance方法的时候,第一个线程判断instance为null,进入了 if,当还没来得及创建对象的时候,第二个线程也判断instance为null,也进入了 if,于是就会创建多个对象,无法达到单例效果,所以我们就引入了锁,也就是synchronized

public class Singleton {public static Singleton instance;private Singleton(){}public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}

这样有效的解决了线程安全的问题,但是,这个锁,锁到了方法上,范围有点大了,其实我们只需要锁出现线程安全的一部分就行了,于是又来了新版本

public class Singleton {public static Singleton instance;private Singleton(){}public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {instance = new Singleton();}}return instance;}
}

这样一来,只锁了new对象的那一部分,当线程来了的时候,我先判断instance是否为空,为空就上锁,不空直接return,但是问题来了,当出现多线程时,第一个线程判断instance为null,进入锁,还没来得及创建对象,第二个线程来了判断instance也为null,当第一个线程走了之后,第二个线程也进入了锁,执行了new,这样线程也不安全了,于是出现了终极版!,也叫做DCL(Double Check Lock)

public class Singleton {public static Singleton instance;private Singleton(){}public static Singleton getInstance() {if (instance == null) { Check onesynchronized (Singleton.class) {if (instance == null) { Check twoinstance = new Singleton();}}}return instance;}
}

这样一来,多线程的情况下,当多个线程进入了第一个 if,但是当第一个 if 执行完毕后,其他线程就算进入锁,也无法通过第二个 if 判断。

设计模式——单例模式(饿汉式、懒汉式和DCL)相关推荐

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

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

  2. 单例模式饿汉式/懒汉式的区别

    単例设计模式(Singleton Pattern): 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法. 如果我们要 ...

  3. 23种设计模式:单例设计模式(饿汉式 VS 懒汉式)

    23种设计模式:单例设计模式(饿汉式 VS 懒汉式) 每博一文案 世事浮沉,有太多的责任需要我们担当,生活中总有些挫折和磨难,让我们觉得快要杠不住了. 但当我们咬牙坚持过那段难熬的时光后,发现并没有想 ...

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

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

  5. C++常用设计模式:单例设计模式(饿汉式、懒汉式)

    一.单例模式的设计套路: 思考:如何绕过常规的构造函数,提供一种机制来保证一个类只有一个实例. 1. 铺垫:静态成员函数特性的总结 使用static关键字修饰类成员函数时,就是把这个成员函数升级成了全 ...

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

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

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

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

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

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

  9. 【学习笔记】【C++整理A】【总】单例模式-饿汉式、懒汉式;

    文章目录 一.语言分类: 三.基础A:- 函数重载.默认参数.extern "C".重复包含 1.函数重载 2.默认参数 3.extern "C" 4.防止重复 ...

  10. 单例设计模式(饿汉式VS懒汉式)

    什么是单例模式 单例(单个的实例) 1.所谓单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法 2.单例设计模式有两种方式:饿 ...

最新文章

  1. c语言内存拷贝 memcpy()函数
  2. 存储过程之游标笔记小结
  3. ADS软件仿真实例大战(一)
  4. scratch3.0教程(持续更新)
  5. 12个国外免费DNS服务
  6. oracle客户端下载和plsql下载以及配置远程连接oracle服务端(超详细)
  7. vuetify模板零基础入门
  8. 大学生常用的pt网站
  9. 《人人都在说谎:赤裸裸的数据真相》读书笔记1
  10. 判断年份是闰年还是平年
  11. linux网站权限恢复,RMAN异机恢复——备份集权限问题
  12. web前端常见面试题
  13. Win10安装Selenium+Chrome+ChromeDriver(应用代码无需设置路径)
  14. 物联网应用之现代档案馆环境智能化监控系统解决方案
  15. 网络工程师面试题(面试必看)(3)
  16. IE显示对象不支持此属性或方法 的解决方法
  17. 在飞书搞了个机器人,我让ChatGPT帮忙写算法
  18. 【小技巧】Linux安装matlab教程
  19. navicat for mysql注册码分享
  20. 制作视频剪辑,自动剪辑视频的软件如何剪辑

热门文章

  1. 使用webpack开发ES6程序的正确姿势
  2. 面试题45:圆圈中最后剩下的数字
  3. 软件加license的一种实现方法
  4. 用 as with ,和 ROW_NUMBER() 做分页查询
  5. Js原生元素选择器 _$获取id class attr 属性集合
  6. 支持位移操作的环形字符串
  7. Java——链表的增删查改
  8. 04-11 常见接口安全测试工具
  9. 服务器win7internet协议议,主编细说win7系统internet协议在哪、添加TCPIP协议的操作方法...
  10. 通过路由远程计算机重启,路由器怎么重启?这几种方法教你重启怎么弄!