news 2026/8/8 20:41:40

单例设计模式(菜鸟教程)--高频面试问题系列

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
单例设计模式(菜鸟教程)--高频面试问题系列

目录

作者有话要说:

一,什么是单例设计模式?

二,单例设计模式有什么特点?

三,什么使用使用单例设计模式?

四,单例设计模式的实现方式?

1.懒汉式的实现方式

2.饿汉式的实现方式

3.双锁检查的实现方式


作者有话要说:

单例模式是面试高频考点之一。本文以问答形式解析单例模式的核心要点,在问题回答时采用最简洁易懂的方式描述,帮助读者快速掌握其精髓,为面试提供清晰应答思路。

一,什么是单例设计模式?

单例设计模式:创建自己的唯一实例,并且给外部提供访问唯一对象的方式。

例如:国家创建自己的唯一首都,经济,政治等内容都是围绕首都开展,开通一个访问通道A,其他国家的人想要访问唯一首都只能通过通道A来访问。

【注意】:创建实例就是:

Dog aa = new Dog();

二,单例设计模式有什么特点?

单例设计模式的特点:

  • 单例类只能有一个实例。(只能new一次)
  • 单例类必须要创建自己的唯一实例。(必须 new)
  • 单例类必须创建一个外部访问自身对象的方式。(必须让别人能访问自己)

单例设计模式的核心:私有化构造方法。

三,什么时候使用单例设计模式?

单例设计模式适合在需要资源独占型场景:需要唯一实例控制资源访问;全局共享状态 / 配置场景:需要统一的全局数据访问;高创建成本的对象:避免频繁创建销毁浪费资源;控制行为的全局唯一性场景:需要统一的逻辑入口的场景下。

例如:

  • 生成唯一序列号(资源独占型场景)。
  • 设计计数器(需要统一的逻辑入口)。

四,单例设计模式的实现方式?

1.懒汉式的实现方式

该实现方式是加入了synchronized关键字,实现了线程安全的懒汉式实现。

语言描述:实现步骤,定义一个静态的实例变量,将构造方法私有化,然后创建外部get访问方法,先判断实例变量是否为空,为空就创建唯一实例。

public class Singleton { //静态的实例变量 private static Singleton instance; //私有化构造方法 private Singleton (){} //外部访问方法 public static synchronized Singleton getInstance() { //判断实例变量是否为空 if (instance == null) { //创建唯一实例 instance = new Singleton(); } return instance; } }

2.饿汉式的实现方式

线程安全的饿汉式实现

语言描述:先定义静态的实例变量并立即初始化,将构造方法私有化,创建外部访问的getInstance()方法。

public class Singleton { //定义静态的实例变量并立即初始化 private static Singleton instance = new Singleton(); //私有化构造方法 private Singleton (){} //创建外部访问的get方法 public static Singleton getInstance() { return instance; } }

3.双锁检查的实现方式(最常用)

语言描述:定义volatile 修饰的静态实例变量,私有化构造方法,创建外部访问的getSingleton()方法加入双重检查和细粒度锁。

public class Singleton { //定义一个静态的实例变量 private volatile static Singleton singleton; //私有化构造方法 private Singleton (){} //创建访问方式 public static Singleton getSingleton() { //判断是否为空 if (singleton == null) { synchronized (Singleton.class) { //再次判断是否为空 if (singleton == null) { singleton = new Singleton(); } } } return singleton; } }

第一步:定义volatile 修饰的静态实例变量(优化核心)

  • 额外添加volatile关键字:这是 DCL 单例的关键优化点,作用是禁止 JVM 对singleton = new Singleton()进行指令重排序,避免多线程下出现 “半初始化实例” 的问题(后文会解释)。
  • 这里并未立即初始化实例(赋值为null),保留了懒加载的特性(用到时才创建)。

第二步:私有化构造方法(单例的核心前提)

第三步:创建外部访问的getSingleton()方法(双重检查 + 细粒度锁)

这是 DCL 单例的核心逻辑,分为三个关键环节,解决了同步方法懒汉式的性能问题:

  1. 第一次判空(无锁检查):如果实例已经创建完成(singleton != null),直接返回实例,无需进入锁逻辑。这一步避免了后续每次调用方法都触发锁竞争,极大提升了高并发场景下的性能。
  2. 加细粒度同步锁:只有当实例未创建时(singleton == null),才对Singleton.class(类对象)加锁,保证同一时间只有一个线程能进入锁代码块。和同步方法相比,锁的粒度从 “整个方法” 缩小到 “实例创建的代码块”,减少了锁的开销。
  3. 第二次判空(锁内检查):进入锁代码块后,再次判断实例是否为null。这是因为可能存在多个线程同时通过第一次判空,等待锁的情况 ——比如线程 A 拿到锁创建了实例,线程 B 随后拿到锁,此时如果没有第二次判空,线程 B 会再次创建实例,破坏单例

补充:volatile的关键作用(为什么必须加?)

singleton = new Singleton()这行代码看似是一步操作,实际 JVM 会拆分为三步:

  1. singleton分配内存空间;
  2. 执行构造方法,初始化singleton对象;
  3. singleton引用指向分配的内存地址(此时singleton != null)。

JVM 为了优化性能,可能会将步骤 2 和 3 重排序(变成 1→3→2)。在多线程下,这会导致:线程 A 执行了 1→3(此时singleton非空但未初始化),线程 B 第一次判空时发现singleton != null,直接返回这个 “半初始化的实例”,调用时会出现异常。

volatile关键字会禁止这种指令重排序,保证步骤 1→2→3 的执行顺序,从而避免了 “半初始化实例” 的问题。

这是目前生产环境中最常用的懒汉式单例实现方式,兼顾了性能和线程安全。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/8 23:45:05

为什么顶级投行都在用R做风险模拟?深度解析蒙特卡洛方法的五大优势

第一章:为什么顶级投行青睐R语言进行风险模拟在金融工程与量化分析领域,R语言已成为顶级投行进行风险模拟的首选工具。其强大的统计建模能力、丰富的金融扩展包以及灵活的数据处理机制,使其在复杂市场环境下的风险评估中表现出色。卓越的统计…

作者头像 李华
网站建设 2026/8/8 7:23:03

【DevSecOps必修课】:基于Docker Scout的5阶段漏洞修复体系构建

第一章:DevSecOps视角下的容器安全挑战在现代软件交付流程中,容器技术已成为DevOps实践的核心组件。然而,随着容器化部署的普及,安全问题不再局限于传统基础设施层面,而是贯穿于开发、构建、部署与运行的全生命周期。从…

作者头像 李华
网站建设 2026/8/9 8:04:47

【归并排序】【快速排序】

【归并排序】【快速排序】 详细讲解见以下视频链接 归并排序视频链接 快速排序视频链接 个人理解&#xff1a; 归并排序&#xff1a;先分再排 快速排序&#xff1a;先排再分 归并排序代码&#xff1a; #include <bits/stdc.h> #define int long long using namespac…

作者头像 李华
网站建设 2026/8/8 3:23:23

(混合检索性能革命):Dify响应时间从3秒到200ms的实践路径

第一章&#xff1a;混合检索的 Dify 响应时间在构建基于大语言模型的应用时&#xff0c;Dify 作为一款低代码平台&#xff0c;支持将向量检索与关键词检索融合&#xff0c;实现高效的混合检索机制。该机制显著影响系统的响应时间&#xff0c;尤其在高并发或大规模数据场景下&am…

作者头像 李华
网站建设 2026/8/7 18:50:11

视频创作SDK,覆盖从拍摄、剪辑、特效、合成等功能

在短视频、直播、社交娱乐和企业数字化内容爆发的时代&#xff0c;视频已不再是专业创作者的专属工具&#xff0c;而是每个人表达自我、传递信息的重要媒介。面对海量用户对高质量、个性化、高效率视频创作的需求&#xff0c;美摄科技凭借多年音视频技术积累与AI算法优势&#…

作者头像 李华
网站建设 2026/8/9 8:29:06

Java毕设选题推荐:基于Springboot+Vue的天气预报管理系统基于springboot天气预报查询系统天气信息【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华