前言

小伙伴们,大家好,我是狂奔の蜗牛rz,当然你们可以叫我蜗牛君,我是一个学习Java一年多时间的小菜鸟,同时还有一个伟大的梦想,那就是有朝一日,成为一个优秀的Java架构师。这个设计模式学习系列是用来记录我学习设计模式基础知识的全过程 ,废话不多说,开始今天关于单例模式学习吧!

单例模式(Singleton)是广泛使用的设计模式,主要作用是保证Java程序中某个类只有一个实例存在。

特点

  • 避免实例对象重复创建,减少每次创建对象时间开销,节约内存空间;
  • 避免由于操作对个实例导致逻辑错误。

应用场景:一些管理器和控制器被设计为单例模式 。

1.饿汉模式

1.1 概念基础

特点: 饿汉模式在类加载时就对实例进行创建, 实例在整个程序周期都存在。

优点: 类加载时创建一次实例, 不会出现多个线程创建多个实例, 避免多线程同步问题。

缺点: 即使单例未被使用也会在类加载之后被创建, 浪费内存空间 。

适用场景: 单例占用内存小, 初始化时就会被使用。

1.2 代码实现

/*** @ClassName CodeMapping* @Description 代码转化类* @author 狂奔de蜗牛rz* @date 2022/06/06*/
public class CodeMapping {// 创建私有静态变量obj(即CodeMapping类的对象实例)private static CodeMapping obj = new CodeMapping();// CodeMapping(代码转化类)的无参构造函数private CodeMapping() {};/*** @Description 获取CodeMapping的单例对象(使用饿汉模式)* @return CodeMapping 代码转化类*/public static CodeMapping getInstance(){// 将obj(代码转化对象实例)进行返回return obj;}}

2.懒汉模式

2.1 概念基础

特点:使用懒汉模式,可以实现延迟加载

优点:懒汉模式中单例在需要时才创建,若单例已创建,再次调用不会重新创建,而是直接返回之前创建的对象

缺点:未考虑线程安全问题,若多个线程并发调用getInstance方法,则会导致创建多个实例

适用场景:若使用某个单例次数少,且创建消耗资源多,需实现单例按需创建

2.2 懒汉式代码实现

/*** @ClassName CodeMapping* @Description 代码转化类* @author 狂奔de蜗牛rz* @date 2022/06/06*/
public class CodeMapping {  // 创建私有静态变量obj(即CodeMapping类的对象实例), 其初值为nullprivate static CodeMapping obj = null;// CodeMapping(代码转化类)的无参构造函数private CodeMapping() {};/*** @Description 获取CodeMapping的单例对象(使用懒汉模式)* @return CodeMapping 代码转化类*/public static CodeMapping getInstance(){// 判断obj(代码转化对象实例)是否为空if(obj == null) {// 若为空, 则重新创建CodeMapping(代码生成类)对象实例obj = new CodeMapping();}// 将obj(代码转化对象实例)进行返回return obj;}}

2.3 使用同步锁解决线程安全问题

2.3.1 概念基础

懒汉模式加上synchronized同步锁, 可以实现延迟加载, 并且解决线程并发问题。

2.3.2 代码实现
/*** @ClassName CodeMapping* @Description 代码转化类* @author 狂奔de蜗牛rz* @date 2022/06/06*/
public class CodeMapping {  // 创建私有静态变量obj(即CodeMapping类的对象实例), 其初值为nullprivate static CodeMapping obj = null;// CodeMapping(代码转化类)的无参构造函数private CodeMapping() {};/*** @Description 获取CodeMapping的单例对象(使用懒汉模式)* @return CodeMapping 代码转化类*/public static synchronized CodeMapping getInstance(){// 判断obj(代码转化对象实例)是否为空if(obj == null) {// 若为空, 则重新创建CodeMapping(代码生成类)对象实例obj = new CodeMapping();}// 将obj(代码转化对象实例)进行返回return obj;}}

3.双重校验锁

3.1 概念基础

优点:不仅实现延迟加载,还解决了线程并发问题, 同时提高执行效率。

缺点:双重校验锁虽然可以解决线程并发问题, 但存在指令重排优化问题。

3.2 双重校验锁代码实现

/*** @ClassName CodeMapping* @Description 代码转化类* @author 狂奔de蜗牛rz* @date 2022/06/06*/
public class CodeMapping {/* 单例模式(双重校验锁), 实现延迟加载, 解决线程并发问题, 解决提高执行效率 */// 创建私有静态变量obj(即CodeMapping类的对象实例), 其初值为nullprivate static CodeMapping obj = null;// CodeMapping(代码转化类)的无参构造函数private CodeMapping() {};/** * @Description 获取CodeMapping的单例对象(使用双重校验锁),*              大部分情况下调用getInstance, 都有不会执行到同步代码块,* @return CodeMapping 代码转化类*/public static CodeMapping getInstance(){// 第一次判断obj(代码转化对象实例)是否为空if(obj == null) {// 给CodeMapping类加同步锁synchronized (CodeMapping.class) {// 第二次判断obj(代码转化对象实例)是否为空if(obj == null) {// 若为空, 则重新创建CodeMapping(代码生成类)对象实例obj = new CodeMapping();        }}}// 将obj(代码转化对象实例)进行返回return obj;}}

3.3 使用volatile关键字解决指令重排优化

3.3.1 概念基础

优点:使用volatile关键字, 可以禁止指令重排序优化(即保证单例对象在被赋值时已被初始化)。

3.3.2 代码实现
/*** @ClassName CodeMapping* @Description 代码转化类* @author 狂奔de蜗牛rz* @date 2022/06/03*/
public class CodeMapping {  // 创建私有静态变量obj(即CodeMapping类的对象实例), 使用volatile关键字 ,其初值为nullprivate static volatile CodeMapping obj = null;// CodeMapping(代码转化类)的无参构造函数private CodeMapping() {};/** * @Description 获取CodeMapping的单例对象(使用双重校验锁),*              大部分情况下调用getInstance, 都有不会执行到同步代码块,* @return CodeMapping 代码转化类*/public static CodeMapping getInstance(){// 第一次判断obj(代码转化对象实例)是否为空if(obj == null) {// 给CodeMapping类加同步锁synchronized (CodeMapping.class) {// 第二次判断obj(代码转化对象实例)是否为空if(obj == null) {// 若为空, 则重新创建CodeMapping(代码生成类)对象实例obj = new CodeMapping();       }}}// 将obj(代码转化对象实例)进行返回return obj;}}

好了,今天的有关 单例模式 的学习就到此结束啦。欢迎小伙伴们积极学习和讨论,喜欢的可以给蜗牛君点个关注,顺便来个一键三连。我们下期见,拜拜啦!



参考博客链接:https://blog.csdn.net/goodlixueyong/article/details/51935526

设计模式基础学习之单例模式相关推荐

  1. 【设计模式】学习笔记---单例模式

    概述 学习设计模式,死记硬背是没用的,还要从实践中理解 日常应用中,设计模式从来都不是单个设计模式独立使用的.在实际应用中,通常多个设计模式混合使用,你中有我,我中有你.下图完整地描述了设计模式之间的 ...

  2. 设计模式再学习之单例模式

    好像在不同的时间段,对设计模式的理解都不同.也可能是又一次学习,所以拔高.也可能是所站角度不同,以前是学习,现在是想应用

  3. 零基础学习设计模式之装饰器模式(配套视频)

    零基础学习设计模式之装饰器模式 定义 在不改变目标结构的情况下,动态的给对象增加功能 举例 如房子装修.相片加相框等,都是装饰器模式. 基本组件 抽象构件(Component)角色:定义一个抽象接口以 ...

  4. 尚学堂JAVA基础学习笔记_2/2

    尚学堂JAVA基础学习笔记_2/2 文章目录 尚学堂JAVA基础学习笔记_2/2 写在前面 第10章 IO技术 1. IO入门 2. IO的API 3. 装饰流 4. IO实战 5. CommonsI ...

  5. Java基础学习——第十章 枚举类注解

    Java基础学习--第十章 枚举类&注解 一.枚举类(enum) 1. 枚举类的概念 枚举类:类的对象只有有限个,确定的 线程状态:创建.就绪.运行.阻塞.死亡 当需要定义一组常量时,强烈建议 ...

  6. Python基础学习-方法

    Python基础学习-方法 方法的重载 方法的动态性 私有属性和私有方法(实现封装) 私有方法 @property装饰器 面向对象的三大特征介绍 继承 语法格式 类成员的继承和重写 查看类的继承层次结 ...

  7. Java基础学习——第六章 面向对象编程(下)

    Java基础学习--第六章 面向对象编程(下) 一.关键词:static 1. static关键字的引入 当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new ...

  8. 【大话设计模式】——浅谈设计模式基础

    初学设计模式给我最大的感受是:人类真是伟大啊!单单是设计模式的基础课程就让我感受到了强烈的生活气息. 个人感觉<大话设计模式>这本书写的真好.让貌似非常晦涩难懂的设计模式变的生活化.趣味化 ...

  9. 零基础学习java,这些书一定要看!

    学习java技术除了看视频,看书也是非常重要的,尤其是零基础同学,本文包含学习Java各个阶段的书籍推荐,史上最全,学习Java,没有书籍怎么行,就好比出征没带兵器一个道理,这些书籍整理出来给大家作为 ...

  10. java基础知识点_零基础学习Java语言,各个阶段需要掌握的知识点

    随社会的脚步的不断发展,Java技术在不断的与时俱进,这也是Java一直长盛不衰的原因之一.Java技术的学习,永远没有早晚之分,技不压身,对于21世纪的我们80后,90后,甚至00后,尤其适用! 那 ...

最新文章

  1. Math.round(11.5)等于多少? Math.round(-11.5)等于多少?
  2. 基于开源Flash Server:Red5构建RTMP流媒体播放平台
  3. 输入一个数寻找丑数C语言,数据结构与算法试题80道.doc
  4. 【Tools】虚拟串口工具之VSPD10
  5. 腾讯自主研发动画组件PAG开源
  6. 个人笔记 Vue.js, Framework7, and Cordova / PhoneGap Template with Babel, Webpack and Hot Reloading...
  7. [linux 技巧] 使用 screen 管理你的远程会话(转载)
  8. sydney airport hotel recommendations
  9. 你有什么难忘的出差经历?
  10. Java线程专栏文章汇总(转)
  11. 学术英语视听说2听力原文_做英语听力题有哪些非常实用的小技巧?
  12. java 默认为空的注解,错误注解的字段设置一个默认的空值
  13. 全网首发:LINUX编译JNA:编译产生libjnidispatch.so
  14. 用javaScript实现轮播图效果 包括自动变换,按钮控制,上一张下一张切换
  15. jupyterLab增大字体大小
  16. 计算机所有程序在哪,电脑自带的便签在哪
  17. canvas实现漂亮的下雨效果
  18. 泰坦以太(以太流说) titan_ysl 2020.01.27
  19. 面向WiFi密码破解的渗透测试研究
  20. oracle中distance用法,distance的用法和短语例句

热门文章

  1. python处理grd格式文件_python基础
  2. 三分钟看完北京城市(含京津冀)【总体规划2016-2050】
  3. MFC对话框标题栏颜色自绘,标题栏由过渡色组成,自绘关闭按钮
  4. python爬虫-urllib-handler和代理
  5. 苹果电脑系统更新中断怎么办_苹果发布健身公告中断按需锻炼空间
  6. Python JsonPath 详细使用
  7. java三角形类_java 三角形类 Triangle的用法详解
  8. python版本的flapy bird_python实现简单flappy bird
  9. Ubuntu16.04 ftp服务器安装+配置
  10. QT控件被其他控件遮盖