单例模式中,为何每种单例都需double-check机制?

2026-05-05 17:181阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计906个文字,预计阅读时间需要4分钟。

单例模式中,为何每种单例都需double-check机制?

主题:fancy前言:前面铺垫了很多,都是在讲原理,讲图例。很多同学可能都觉得和设计模式不是那么搭边。确实,设计模式也是一种理论的东西,但设计原则可能对我们理解来说,更加具有直观的抽象。

单例模式中,为何每种单例都需double-check机制?


theme: fancy 前言
  • 前面铺掉了那么多都是在讲原则,讲图例。很多同学可能都觉得和设计模式不是很搭边。虽说设计模式也是理论的东西,但是设计原则可能对我们理解而言更加的抽象。不过好在原则东西不是很多,后面我们就可以开始转讲设计模式了。
  • 我的思路是按照设计模式进行分类整理。期间穿插相关的知识进行扩展从而保证我们学习的更加的全面。在正式开始前我现在这里立个Flag。争取在20周内完成我们设计模式章节的内容。期间可能会有别的学习,20周争取吧
  • 相信单例模式是大家第一个使用到的设计模式吧。不管你怎么样,我第一个使用的就是单例模式。其实单例模式也是分很多种的、。如果在细分还有线程安全和线程不安全版本的。
饿汉式
  • 顾名思义饿汉式就是对类需求很迫切。从Java角度看就是类随着JVM启动就开始创建,不管你是否使用到只要JVM启动就会创建。

public class SingleFactory { private static Person person = new Person(); ​ private SingleFactory() { } ​ public static Person getInstance() { return person; } }

  • 上面这段代码就是饿汉式单例模式。通过这单代码我们也能够总结出单例模式的几个特点
  • 特点 隐藏类的创建即外部无法进行创建 内部初始化好一个完整的类 提供一个可以访问到内部实例的方法,这里指的是getInstance

  • 单例模式特点还是很容易区分的。饿汉式感觉挺好的,那为什么后面还会出现懒汉式及其相关的变形呢?下面我们就来看看饿汉式有啥缺点吧。
  • 首先上面我们提到饿汉式的标志性特点就是随着JVM 的启动开始生成实例对象。这是优点同时也是缺点。大家应该都用过Mybatis等框架,这些框架为了加快我们程序的启动速度纷纷推出各种懒加载机制。
  • 何为懒加载呢?就是用到的时候再去初始化相关业务,将和启动不相关的部分抽离出去,这样启动速度自然就快了起来了。在回到饿汉式,你不管三七二十一就把我给创建了这无疑影响了我的程序启动速度。如果这个单例模式你使用了倒还好,假如启动之后压根就没用到这个单例模式的类,那我岂不是吃力不讨好。不仅浪费了时间还浪费了我的空间。
  • 所以说,处于对性能的考虑呢?还是建议大家不要使用饿汉式单例。但是,存在即是合理的,我们不能一棒子打死一堆人。具体场景具体对待吧XDM。

本文共计906个文字,预计阅读时间需要4分钟。

单例模式中,为何每种单例都需double-check机制?

主题:fancy前言:前面铺垫了很多,都是在讲原理,讲图例。很多同学可能都觉得和设计模式不是那么搭边。确实,设计模式也是一种理论的东西,但设计原则可能对我们理解来说,更加具有直观的抽象。

单例模式中,为何每种单例都需double-check机制?


theme: fancy 前言
  • 前面铺掉了那么多都是在讲原则,讲图例。很多同学可能都觉得和设计模式不是很搭边。虽说设计模式也是理论的东西,但是设计原则可能对我们理解而言更加的抽象。不过好在原则东西不是很多,后面我们就可以开始转讲设计模式了。
  • 我的思路是按照设计模式进行分类整理。期间穿插相关的知识进行扩展从而保证我们学习的更加的全面。在正式开始前我现在这里立个Flag。争取在20周内完成我们设计模式章节的内容。期间可能会有别的学习,20周争取吧
  • 相信单例模式是大家第一个使用到的设计模式吧。不管你怎么样,我第一个使用的就是单例模式。其实单例模式也是分很多种的、。如果在细分还有线程安全和线程不安全版本的。
饿汉式
  • 顾名思义饿汉式就是对类需求很迫切。从Java角度看就是类随着JVM启动就开始创建,不管你是否使用到只要JVM启动就会创建。

public class SingleFactory { private static Person person = new Person(); ​ private SingleFactory() { } ​ public static Person getInstance() { return person; } }

  • 上面这段代码就是饿汉式单例模式。通过这单代码我们也能够总结出单例模式的几个特点
  • 特点 隐藏类的创建即外部无法进行创建 内部初始化好一个完整的类 提供一个可以访问到内部实例的方法,这里指的是getInstance

  • 单例模式特点还是很容易区分的。饿汉式感觉挺好的,那为什么后面还会出现懒汉式及其相关的变形呢?下面我们就来看看饿汉式有啥缺点吧。
  • 首先上面我们提到饿汉式的标志性特点就是随着JVM 的启动开始生成实例对象。这是优点同时也是缺点。大家应该都用过Mybatis等框架,这些框架为了加快我们程序的启动速度纷纷推出各种懒加载机制。
  • 何为懒加载呢?就是用到的时候再去初始化相关业务,将和启动不相关的部分抽离出去,这样启动速度自然就快了起来了。在回到饿汉式,你不管三七二十一就把我给创建了这无疑影响了我的程序启动速度。如果这个单例模式你使用了倒还好,假如启动之后压根就没用到这个单例模式的类,那我岂不是吃力不讨好。不仅浪费了时间还浪费了我的空间。
  • 所以说,处于对性能的考虑呢?还是建议大家不要使用饿汉式单例。但是,存在即是合理的,我们不能一棒子打死一堆人。具体场景具体对待吧XDM。