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

Java 设计模式 二 单例模式 (Singleton Pattern)

单例模式 (Singleton Pattern) 是一种常见的设计模式,属于创建型模式。它的核心思想是确保一个类只有一个实例,并提供一个全局访问点来获取该实例。通常用于那些需要全局控制的场景,比如配置管理、日志系统、数据库连接池等。

1. 单例模式的优点:

  • 全局访问点: 提供了一个全局唯一的实例,所有客户端都可以通过这个实例来访问相关功能。
  • 控制实例化次数: 确保只有一个实例,可以节省资源,并且避免对象的重复创建。
  • 延迟实例化: 只在需要时才创建实例,避免不必要的内存开销。

2. 单例模式的实现方式

1) 懒汉式(Lazy Initialization)

懒汉式是在第一次调用 getInstance() 方法时才创建实例,直到那时才初始化。为了保证线程安全,我们通常使用 synchronized 来同步 getInstance 方法。

优点: 延迟实例化,减少不必要的资源浪费。

缺点: 每次调用 getInstance() 时都要进行同步,性能较差。

public class Singleton {private static Singleton instance;private Singleton() {}public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}
2) 饿汉式(Eager Initialization)

饿汉式是在类加载时就创建实例,这种方式不需要进行同步,因此线程安全性较好。

优点: 实现简单,线程安全。

缺点: 无论是否使用该实例,类加载时就已经创建了对象,这可能会导致资源浪费。

public class Singleton {private static final Singleton instance = new Singleton();private Singleton() {}public static Singleton getInstance() {return instance;}
}
3) 双重检查锁定(Double-Checked Locking)

为了提高性能,可以在第一次检查时不加锁,只有在实例为 null 时才加锁。加锁的操作只会发生一次,从而避免每次调用时都进行同步。

优点: 性能较好,仅在第一次创建实例时加锁。

缺点: 代码复杂,且需要使用 volatile 关键字确保多线程情况下的正确性。

public class Singleton {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;}
}
4) 静态内部类(Bill Pugh Singleton)

这种方式利用了类加载的机制,保证了线程安全,并且实现了懒加载。它是单例模式的推荐实现方式。

优点: 简洁、线程安全、懒加载,性能优秀。

缺点: 没有明显的缺点。

public class Singleton {private Singleton() {}private static class SingletonHolder {private static final Singleton INSTANCE = new Singleton();}public static Singleton getInstance() {return SingletonHolder.INSTANCE;}
}
5) 枚举式(Enum Singleton)

Java 提供的枚举类型本身就是单例的,它可以保证线程安全、避免反序列化以及类加载机制的优势。

优点: 线程安全、避免反射攻击、保证单例。

缺点: 实现略显复杂,但在现代 Java 开发中,这通常是最推荐的单例实现方式。

public enum Singleton {INSTANCE;public void doSomething() {System.out.println("Doing something...");}
}

使用时:

Singleton.INSTANCE.doSomething();

3. 何时使用单例模式

  • 共享资源:例如数据库连接池、线程池、配置管理等,需要在整个应用中共享一个对象实例。
  • 全局控制:需要在系统中保证唯一的控制对象,例如日志系统。
  • 频繁创建销毁对象的场景:例如复杂对象的创建、管理较为耗费资源,可以使用单例来避免重复创建。

4. 注意事项

  • 线程安全:在多线程环境下,需要确保实例化过程是线程安全的。
  • 反射和反序列化攻击:单例类可以通过反射或反序列化破坏其唯一性,枚举单例可以避免这种情况。
  • 性能问题:使用懒汉式时,如果没有做适当优化,可能会在高并发情况下影响性能。

总结

单例模式是一种非常常见且有用的设计模式,能够确保类只有一个实例,并且提供全局访问点。在 Java 中,推荐使用静态内部类单例模式枚举单例模式,这两种方式在性能、线程安全性和代码简洁性上都非常优秀。

相关文章:

Java 设计模式 二 单例模式 (Singleton Pattern)

单例模式 (Singleton Pattern) 是一种常见的设计模式,属于创建型模式。它的核心思想是确保一个类只有一个实例,并提供一个全局访问点来获取该实例。通常用于那些需要全局控制的场景,比如配置管理、日志系统、数据库连接池等。 1. 单例模式的…...

Java 中 final 关键字的奥秘

目录 一、final 修饰类:封印的 “永恒之石” 二、final 修饰变量:锁定的 “不变之值” 三、final 修饰方法:不可撼动的 “坚固堡垒” 四、总结 在 Java 编程的世界里,final 关键字就像一把神奇的 “锁”,一旦使用&…...

C# 通用缓存类开发:开启高效编程之门

引言 嘿,各位 C# 开发者们!在当今快节奏的软件开发领域,提升应用程序的性能就如同给跑车装上涡轮增压,能让你的项目在激烈的竞争中脱颖而出。而构建一个高效的 C# 通用缓存类,无疑是实现这一目标的强大武器。 想象一…...

电脑办公技巧之如何在 Word 文档中添加文字或图片水印

Microsoft Word是全球最广泛使用的文字处理软件之一,它为用户提供了丰富的编辑功能来美化和保护文档。其中,“水印”是一种特别有用的功能,它可以用于标识文档状态(如“草稿”或“机密”)、公司标志或是版权信息等。本…...

记录一下OpenCV Contrib 编译踩的坑

最近有需要采用OpenCV Contrib 里面的函数做一下处理,要重新编译,一路编译两三个小时了,记录一下备忘吧。 1、编译前先准备好如下环境 ①visual studio已安装,具体版本和型号根据需求经验来,我看常用的是VS2015、VS201…...

01.04、回文排序

01.04、[简单] 回文排序 1、题目描述 给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。回文串不一定是字典当中的单词。 2、解题思路 回文串的特点: 一个回文串在…...

[创业之路-259]:《向流程设计要效率》-1-让成功成熟业务交给流程进行复制, 把创新产品新业务新客户交给精英和牛人进行探索与创造

标题:成功与创新的双轨并行:以流程复制成熟,以精英驱动新知 在当今这个日新月异的商业环境中,企业要想持续繁荣发展,就必须在稳定与创新之间找到完美的平衡点。一方面,成熟业务的稳定运营是企业生存和发展的…...

如何使用usememo和usecallback进行性能优化,什么时候使用usecallback,什么时候使用usememo

React useMemo 和 useCallback 性能优化总结以及使用场景 基本概念 useMemo 用于缓存计算结果,避免在每次渲染时重复进行昂贵的计算。 useCallback 用于缓存函数引用,避免在每次渲染时创建新的函数引用。 使用时机对比 useMemo 适用场景 复杂计算…...

22. C语言 输入与输出详解

本章目录: 前言1. 输入输出的基础概念1.1 标准输入输出流1.2 输入输出函数 2. 格式化输出与输入2.1 使用 printf() 进行输出示例 1: 输出字符串示例 2: 输出整数示例 3: 输出浮点数 2.2 使用 scanf() 进行输入示例 4: 读取整数和字符改进方案:使用getchar()清理缓冲…...

WPF实战案例 | C# WPF实现计算器源码

WPF实战案例 | C# WPF实现计算器源码 一、设计来源计算器应用程序讲解1.1 主界面1.2 计算界面 二、效果和源码2.1 界面设计(XAML)2.2 代码逻辑(C#)2.3 实现步骤总结 源码下载更多优质源码分享 作者:xcLeigh 文章地址&a…...

AutoGen入门——快速实现多角色、多用户、多智能体对话系统

1.前言 如https://github.com/microsoft/autogen所述,autogen是一多智能体的框架,属于微软旗下的产品。 依靠AutoGen我们可以快速构建出一个多智能体应用,以满足我们各种业务场景。 本文将以几个示例场景,使用AutoGen快速构建出…...

LeetCode 热题 100_全排列(55_46_中等_C++)(递归(回溯))

LeetCode 热题 100_两数之和(55_46) 题目描述:输入输出样例:题解:解题思路:思路一(递归(回溯)): 代码实现代码实现(思路一&#xff08…...

将 AzureBlob 的日志通过 Azure Event Hubs 发给 Elasticsearch(1.标准版)

问题 项目里使用了 AzureBlob 存储了用户上传的各种资源文件,近期 AzureBlob 的流量费用增长很快,想通过分析Blob的日志,获取一些可用的信息,所以有了这个需求:将存储账户的日志(读写,审计&…...

pthread_exit函数

pthread_exit 是 POSIX 线程库(pthread)中的一个函数,用于显式地终止调用线程。与 exit 函数不同,pthread_exit 仅影响调用它的线程,而不是整个进程。使用 pthread_exit 可以确保线程在退出时能够正确地释放线程相关的…...

1月21日星期二今日早报简报微语报早读

1月21日星期二,农历腊月廿二,早报#微语早读。 1、多地官宣:2025年可有序、限时或在限定区域燃放烟花爆竹; 2、TikTok恢复在美服务;特朗普提出继续运营TikTok方案,外交部:若涉及收购中国企业应…...

【2024年终总结】我与CSDN的一年

👉作者主页:心疼你的一切 👉作者简介:大家好,我是心疼你的一切。Unity3D领域新星创作者🏆,华为云享专家🏆 👉记得点赞 👍 收藏 ⭐爱你们,么么哒 文章目录 …...

openssl 正确生成v3带SAN的证书

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...

Golang Gin系列-5:数据模型和数据库

在这篇Gin教程的博客中,我们将探索如何将模型和数据库与Gin框架无缝集成,使你能够构建健壮且可扩展的web应用程序。通过利用流行的库并遵循最佳实践,你将学习如何定义模型、建立数据库连接、执行CRUD操作以及确保基于gin的项目中的数据完整性…...

比简单工厂更好的 - 工厂方法模式(Factory Method Pattern)

工厂方法模式(Factory Method Pattern) 工厂方法模式(Factory Method Pattern)工厂方法模式(Factory Method Pattern)概述工厂方法模式(Factory Method Pattern)结构图工厂方法模式&…...

分布式搜索引擎02

1. DSL查询文档 elasticsearch的查询依然是基于JSON风格的DSL来实现的。 1.1. DSL查询分类 Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括: 查询所有:查询出所有数据&#xff0c…...

从原理到实战:用Optuna解锁超参数调优新姿势

1. 为什么我们需要Optuna? 刚入行做机器学习那会儿,调参简直是我的噩梦。记得有一次为了调一个XGBoost模型,我手动试了200多种参数组合,整整三天没合眼,最后模型准确率才提升了0.3%。直到遇到Optuna,我才发…...

技术对业务的赋能

技术对业务的赋能 技术不只是实现需求,更是提升效率、降低成本、放大增长、控制风险,最终帮业务赚到更多、跑得更快、活得更稳。 1. 提升效率,降本增效 自动化流程:表单、审批、报表自动生成,减少人工重复劳动组件化/低…...

STM32F4项目实战:用INA219给锂电池做个“智能管家”(附完整代码)

STM32F4项目实战:用INA219打造高精度锂电池监控系统 锂电池作为便携式设备的能量来源,其状态监控直接影响设备可靠性和用户体验。传统电压检测法误差高达20%,而采用TI的INA219电流传感器配合STM32F4系列MCU,可实现0.5%精度的充放电…...

矽力杰 Silergy SY8521 降压稳压器 佰祥电子

100V母线辅助供电的“空间魔术”:SY8521全集成同步降压方案实战拆解在隔离型通信偏置电源、BMS高压从板以及汽车电子的48V/60V系统中,硬件团队在设计辅助供电轨时常常面临极其严苛的物理与电气双重挑战。系统母线在遭遇抛负载(Load Dump&…...

Legacy-iOS-Kit:让旧款iOS设备重获新生的开源工具完整指南

Legacy-iOS-Kit:让旧款iOS设备重获新生的开源工具完整指南 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to restore/downgrade, save SHSH blobs, jailbreak legacy iOS devices, and more 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit …...

域环境共享文件夹容量配额管理实战:从配置到组策略映射

1. 域环境共享文件夹容量配额管理入门指南 想象一下公司文件服务器上有个共享文件夹,所有员工都把工作文档往里面扔。突然某天你发现硬盘爆满,系统崩溃,原因竟是市场部的同事上传了200GB的营销视频素材。这种场景在企业IT管理中屡见不鲜&…...

告别VMware窗口切换!用Termius SSH直连CentOS 7虚拟机的保姆级教程

告别VMware窗口切换!用Termius SSH直连CentOS 7虚拟机的保姆级教程 每次在宿主机和虚拟机之间来回切换窗口,是不是让你感到效率低下?尤其当需要同时操作多个虚拟机时,频繁的窗口切换不仅浪费时间,还容易打断工作流。本…...

全球工业不间断电源行业市场规模与增长预测

工业不间断电源(简称工业UPS),专为严苛工业环境而设计,在复杂工业环境下为关键负荷提供高可靠性、高稳定性、强抗干扰能力的电力保护专。它的核心功能是在市电发生波动、短时断电或其他电力异常情况下,为关键设备提供持续、稳定的…...

DC-DC移相全桥MATLAB仿真 DC- DC移相全桥电路 移相全桥DC-DC变换器matlab_simulink仿真,功率管采用mosfet,副边接整流电路。 采用PWM控制

DC-DC移相全桥MATLAB仿真 DC- DC移相全桥电路 移相全桥DC-DC变换器matlab/simulink仿真,功率管采用mosfet,副边接整流电路。 采用PWM控制; 输出稳定且可调,可稳定输出电压你想要的值 matlab 编辑 1function create_PSFB_Model(…...

OpenClaw定时任务实战:gemma-3-12b-it每日凌晨自动备份重要文件

OpenClaw定时任务实战:gemma-3-12b-it每日凌晨自动备份重要文件 1. 为什么需要自动化文件备份 上周我的移动硬盘突然罢工,导致三个月的工作文档险些丢失。这次事故让我意识到:人工备份永远存在疏漏。即使设置了日历提醒,也难免因…...