当前位置: 首页 > news >正文

一篇文章带你搞懂“设计模式”! - - 单例模式(2)

单例模式

所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法

单例模式有八种方式:

饿汉式(静态常量)、饿汉式(静态代码块)、懒汉式(线程不安全)、懒汉式(线程安全,同步方法)、懒汉式(线程安全,同步代码块)、双重检查、静态内部类、枚举


第一种:饿汉式(静态常量)

实现步骤如下:

  • 构造器私有化(防止被new)
  • 类的内部创建对象
  • 向外部暴露一个静态的公共方法(getInstance)
class Singleton { // 1.构造器私有化 private Singleton() { // ... } // 2.在本类内部创建对象实例 private final static Singleton instance = new Singleton(); // 3.对外提供一个公有的静态方法,返回实例对象 public static Singleton getInstance() { return instance; } }

优点:写法简单,在类装载的时候完成实例化,避免了线程同步问题

缺点:在类装载的时候完成实例化,没有懒加载的效果。如果未曾使用过这个类,会造成内存的浪费

第二种:饿汉式(静态代码块)
class Singleton { // 1.构造器私有化 private Singleton() { // ... } // 2.在本类内部声明静态对象属性 private static Singleton instance; // 3.使用静态代码块创建对象 static { instance = new Singleton(); } // 4.对外提供一个公有的静态方法,返回实例对象 public static Singleton getInstance() { return instance; } }

优缺点:与静态常量一样,无非就是把实例化过程放在了静态代码块

第三种:懒汉式(线程不安全)
class Singleton { private static Singleton instance; private Singleton() {} // 提供一个静态的公有方法,当使用到该方法的时,才去创建实例 public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }

优缺点:

  • 起到了懒加载的效果,但是只能在单线程下使用。
  • 如果在多线程下使用,由于静态获取方法未进行线程安全处理,可能会导致产生多个实例
  • 因此实际开发中,不建议使用
第四种:懒汉式(线程安全,同步方法)
class Singleton { private static Singleton instance; private Singleton() {} // 提供一个静态的公有方法,当使用到该方法的时,才去创建实例 // 加入了synchronized的同步处理机制,解决线程安全问题 public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }

优缺点:

  • 解决了线程不安全问题
  • 但是由于同步处理,导致效率低,其实获取方法只要执行一次就够了
  • 因此实际开发中,也不建议使用
第五种:懒汉式(线程安全,同步代码块)
class Singleton { private static Singleton instance; private Singleton() {} // 提供一个静态的公有方法,当使用到该方法的时,才去创建实例 public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { instance = new Singleton(); } } return instance; } }

优缺点:

  • 这种方法本意为了改进前一种的效率问题
  • 但是反而起不到线程同步作用,依旧可能有多个线程进到if语句,会产生多个实例
  • 因此实际开发中,不能使用
第六种:双重检查
class Singleton { // 使用轻量级volatile private static volatile Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { // 第二次检查,防止重复创建实例 if (instance == null) { instance = new Singleton(); } } } return instance; } }

优缺点:

  • 双重检查有效保证了线程安全
  • 同时也避免反复进行方法同步,提高效率
  • 满足线程安全,延迟加载,效率高,实际开发中,推荐使用
第七种:静态内部类
class Singleton { private Singleton() {} // 创建一个静态内部类 private static class SingletonInstance { private static final Singleton INSTANCE = new Singleton(); } public static Singleton getInstance(){ return SingletonInstance.INSTANCE; } }

优缺点:

  • 这种方法采用了类装载的机制来保证初始化实例只有一个线程
  • 静态内部类方式在Singleton类被装载时并不会立即实例化,而是在需要实例化时,调用getInstance方法,才会装载SingletonInstance类,从而完成Singleton的实例化。
  • 类的静态属性只会在第一次加载类的时候初始化,所以在这里,JVM帮助我们保证了线程的安全性,因为在类进行初始化时,是线程安全的(别的线程无法进入)。
  • 因此避免了线程不安全,利用静态内部类特点实现延迟加载,效率高。实际开发中,推荐使用。
第八种:枚举
enum Singleton { INSTACNE; public void method() { // ... } }

优缺点:

  • 通过枚举来实现单例模式,不仅能避免多线程同步问题
  • 而且还能防止反序列化重新创建新的对象
  • 推荐使用
使用单例模式的注意事项
  1. 单例模式保证了系统内存中该类只存在一个对象,节省了系统资源,对于一些需要频繁创建销毁的对象,使用单例模式可以提高系统性能
  2. 当想实例化一个单例类的时候,必须要记住使用相应的获取对象的方法,而不是直接使用new
  3. 单例模式的使用场景:
    1. 需要频繁创建和销毁对象
    2. 创建对象时耗时过多或耗费资源过多(大对象)但又要经常用到的对象
    3. 工具类对象
    4. 频繁访问数据库或文件的对象(比如数据源、session工厂等)
http://www.jsqmd.com/news/412932/

相关文章:

  • 大规模语言模型在自动编程助手中的交互式应用
  • 慧课方舟测试报告
  • 年后大家别轻易离职了!!!
  • 数据科学在大数据领域的美容行业数据洞察
  • 手把手教你用Qwen3-ASR搭建智能语音转文字服务
  • 如何确认Windows电脑是否支持安装苹果系统?
  • 手把手教你用Qwen3-ASR-0.6B搭建语音识别服务
  • Gemma-3-270m零基础教程:5分钟部署你的首个文本生成AI
  • AnimateDiff写实人物生成:让虚拟主播动起来
  • ESP32-CAM串口传图与横屏显示全链路实现
  • Xinference轻松上手:SSH远程部署指南
  • 在 Ubuntu 上安装 virt-manager
  • IT数学基础番外7--卡尔曼滤波的数学解释(TODO)
  • Z-Image i2L性能优化:如何在低配电脑上流畅运行
  • ESP32-CAM与主控双机UART通信架构设计
  • Java Web 和餐饮管理系统系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】
  • AcousticSense AI开发者案例:嵌入式音频分析服务API封装实践
  • LingBot-Depth入门指南:深度图单位毫米与实际物理尺寸换算方法
  • 【毕业设计】SpringBoot+Vue+MySQL 在线互动学习网站平台源码+数据库+论文+部署文档
  • Qwen3-ASR-1.7B智能家居应用:语音控制中枢实践
  • SpringBoot+Vue 毕业就业信息管理系统管理平台源码【适合毕设/课设/学习】Java+MySQL
  • ESP32-CAM与主控ESP32的UART点对点通信实战
  • 如何高效获取Gofile资源?这款Python工具让下载效率提升数倍
  • Qwen3-ForcedAligner实战案例:如何高效制作语音时间轴
  • SenseVoice-Small模型在呼叫中心语音分析中的实践
  • 掌握4大核心功能:Driver Store Explorer让Windows驱动管理效率提升90%
  • 实测分享:Qwen3-0.6B-FP8极速对话工具在低配电脑上的表现
  • Qwen3-Reranker Semantic Refiner应用案例:电商知识库RAG精度提升42%实录
  • Zotero插件市场彻底改变文献管理方式:让学术效率提升3倍
  • MedGemma-X临床术语库扩展:接入SNOMED CT与ICD-11编码映射表