单例模式

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

代码解释

/*** 懒汉式单例模式* 缺点:效率太低*/
class SingletonPattern1{private static SingletonPattern1 singletonPattern1;public SingletonPattern1(){}public static synchronized SingletonPattern1 getSingletonPattern1(){if (singletonPattern1 != null){singletonPattern1 = new SingletonPattern1();}return singletonPattern1;}}/*** 饿汉式单例模式* 缺点:浪费了额外的内存*/
class SingletonPattern2{private static SingletonPattern2 singletonPattern2 = new SingletonPattern2();public static SingletonPattern2 getSingletonPattern2(){return singletonPattern2;}
}/*** 双空判断单例模式*/
class SingletonPattern3{private volatile static SingletonPattern3 singletonPattern3;public SingletonPattern3(){}/*** 采用双空判断的理由:第一次空值判断是为了增加效率,第二次空值判断是为了防止多并发情况下的多次创建* 场景一:如果只有内层空值判断*      这样的话当类被实例化之后,后续的已经创建了实例提取实例同样会被阻塞,影响效率* 场景二:如果只有外层判断*      这样的话当多线程的条件下,同时有多个线程进入了空值判断后,这种情况会创建多次对象,违背单例模式* @return*/public static SingletonPattern3 getSingletonPattern3(){if(singletonPattern3 == null){synchronized (SingletonPattern3.class){if (singletonPattern3 == null){return new SingletonPattern3();}}}return singletonPattern3;}}/*** 登记式单例模式* 此种方式利用了 classloader 机制来保证初始化 instance 时只有一个线程*/
class SingletonPattern4{private static class SingletonPattern4Holder{private static final SingletonPattern4 singletonPattern4 = new SingletonPattern4();}public SingletonPattern4(){}public static SingletonPattern4 getSingletonPattern4(){return SingletonPattern4Holder.singletonPattern4;}
}/*** 枚举单例模式*/
enum SingletonPattern5{INSTANCE;public void show(){System.out.println("类中的测试方法");}
}

总结

一般情况下,不建议使用第 1 种和第 2 种懒汉方式,建议使用第 3 种饿汉方式。只有在要明确实现 lazy loading 效果时,才会使用第 5 种登记方式。如果涉及到反序列化创建对象时,可以尝试使用第 6 种枚举方式。如果有其他特殊的需求,可以考虑使用第 4 种双检锁方式。

详情参照

菜鸟教程
https://www.runoob.com/design-pattern/singleton-pattern.html

单例模式的五种实现形式(懒汉式,饿汉式,双空判断,内部类,枚举)相关推荐

  1. 【无标题】单例模式的两种创建方式:饿汉式和懒汉式

    这里写自定义目录标题 单例模式的两种创建方式:饿汉式和懒汉式 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂 ...

  2. 单例模式:懒汉式 饿汉式 双检锁 登记式 枚举式 详细讲解

    单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这种模式涉及到一个单一的类,该类负责创建自己的对 ...

  3. 单例模式【懒汉式+饿汉式+枚举】

    软件设计模式(Software Design Pattern) 又称设计模式,是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.它描述了在软件设计过程中的一些不断重复发生的问题,以及 ...

  4. Spring框架学习day_01: 框架配置方式/ 管理对象的作用域/ 生命周期/ 组件扫描/ 单例模式:“懒汉式“,“饿汉式“

    1. Spring框架的作用 Spring框架的主要作用是创建对象和管理对象. 创建对象:类似于User user = new User(); 管理对象:随时可以通过Spring框架获取对象,甚至Sp ...

  5. 单例模式之懒汉式/饿汉式/结合二者之优的模式

    单例模式主要用来产生一个对象的具体实例,它可以确保系统中一个类只产生一个实例. 两个好处: 对于频繁使用的对象,可以省略new操作花费的时间 new的次数少了,对系统内存的使用频率就小了,那么GC压力 ...

  6. Java单例模式【懒汉式饿汉式】

    目录 一. 单例模式的解释 二. 实现方法 2.1 饿汉式 2.1.1饿汉式的实现代码 2.2 懒汉式 2.2.1懒汉式的实现代码 三. 单例设计模式的好处 3.1单例模式的应用场景 一. 单例模式的 ...

  7. 单例模式的四种实现方式(饿汉模式、懒汉模式、静态内部类、枚举类)

    首先,设计模式是我们程序员在软件开发过程中面临的一般问题的解决方案,通过学习设计模式可以使我们在编程时更加有条理性,同时培养我们写代码的思维能力,从而提高我们的工作效率.接下来就跟着博主的脚步往下走吧 ...

  8. Java 单例模式常见五种实现方式

    定义 单例模式,属于创建类型的一种常用的软件设计模式. 单例模式最初的定义出现于<设计模式>(艾迪生维斯理, 1994):"保证一个类仅有一个实例,并提供一个访问它的全局访问点. ...

  9. 单例模式的懒汉式和饿汉式的线程安全问题

    单例模式一般有两种形式:懒汉式和饿汉式. 饿汉式是线程安全的,它的基本实现代码如下: public class SingletonTest1 {public static void main(Stri ...

最新文章

  1. Tautology--POJ 3295
  2. jquery css 定义背景不重复
  3. java新建配置文件_使用Java输出字符流FileWriter创建配置文件
  4. Python中的特殊属性与方法
  5. 阿里云Kubernetes CSI实践—NAS动态存储卷使用
  6. 咦,拆分个字符串都这么讲究?
  7. 广东哪所大学计算机专业好,准备考研,广东哪所大学的计算机专业最好?除了985,这所大学性价比很高...
  8. 基于Matlab的跨孔层析成像的最短路径法弯曲射线追踪(二)
  9. Kali Linux Web 渗透测试秘籍 第六章 利用 -- 低悬的果实
  10. 普元BPS:唯一零错误的流程平台
  11. 使用CALayer设置图像边框
  12. VS报:dll标记为系统必备组件,必须对其进行强签名错误
  13. qq降龙v5java_java编辑器
  14. 禁用EnableViewState和启用EnableViewStat时请注意
  15. matlab批量将mp3文件转wav文件
  16. python代码写龙卷风_python – 带有龙卷风的ZODB
  17. 电影《战狼》评论词云分析
  18. 替换读到的文件中的某一元素 pd 格式
  19. GBASE 8A v953报错集锦56--Hadoop 加载失败问题
  20. 徐东山:腾讯云安全的使命和技术实现

热门文章

  1. PuTTY的简介及使用
  2. python去除空格和换行
  3. Wi-Fi Mesh网络技术
  4. 【UiBot科普】RPA软件机器人如何多流程协作?
  5. Ubuntu17.04安装Firefox的flash插件
  6. linux 7 删除mtab内容,centos7之文件搜索及sed文本处理
  7. 51单片机语音声控智能台灯可调光冷暖光人检测锂电池供电太阳能和USB充电
  8. 量子计算机可以发明时光机,全球第一台时光机? 科学家声称用量子电脑办到了...
  9. 浅谈oracle复合数据类型
  10. RFID叉车读写器在智能仓库收发货环节中的应用-铨顺宏