【Spring】单例模式的创建方式(Bean解析)
在Java中,单例模式(Singleton Pattern)确保一个类只有一个实例,并提供全局访问点。以下是实现单例的五种常见方式:懒汉式、饿汉式、双重检查锁、静态内部类和枚举,包括代码示例和优缺点分析。
1. 懒汉式(Lazy Initialization)
- 特点:延迟加载,实例在第一次使用时创建。
- 线程安全:基本实现非线程安全,需加锁优化。
- 代码示例:
public class Singleton {private static Singleton instance;private Singleton() {} // 私有构造,防止外部实例化public static Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;} }
- 线程安全版(加锁):
public class Singleton {private static Singleton instance;private Singleton() {}public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;} }
- 线程安全版(加锁):
- 优点:
- 延迟加载,节省内存(只有在使用时才创建实例)。
- 缺点:
- 基本版线程不安全。
- 线程安全版使用
synchronized
方法锁,性能较低(每次调用都加锁)。
- 适用场景:单线程环境或实例创建开销小、对性能要求不高的场景。
2. 饿汉式(Eager Initialization)
- 特点:类加载时就创建实例,急切初始化。
- 线程安全:天然线程安全,依赖JVM类加载机制。
- 代码示例:
public class Singleton {private static final Singleton instance = new Singleton();private Singleton() {}public static Singleton getInstance() {return instance;} }
- 优点:
- 实现简单,线程安全(由JVM类加载保证)。
- 无需加锁,性能较高。
- 缺点:
- 非延迟加载,类加载时即创建实例,可能浪费内存(如果实例未被使用)。
- 如果构造方法有复杂逻辑,类加载可能变慢。
- 适用场景:实例创建开销小、确定会被使用的场景。
3. 双重检查锁(Double-Checked Locking, DCL)
- 特点:结合懒汉式的延迟加载和线程安全,减少锁粒度。
- 线程安全:通过
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;} }
- 关键点:
volatile
防止指令重排序,确保实例初始化完成前不被其他线程访问。- 双重检查减少锁竞争,仅在实例未创建时加锁。
- 优点:
- 延迟加载,节省内存。
- 线程安全,性能较高(锁粒度小)。
- 缺点:
- 实现较复杂,需理解
volatile
和指令重排序。 - 早期Java版本(1.4及之前)可能有DCL失效问题(现已解决)。
- 实现较复杂,需理解
- 适用场景:需要延迟加载且高并发的场景。
4. 静态内部类(Static Inner Class)
- 特点:利用JVM类加载机制实现延迟加载和线程安全。
- 线程安全:由JVM保证静态内部类加载时的线程安全。
- 代码示例:
public class Singleton {private Singleton() {}private static class SingletonHolder {private static final Singleton INSTANCE = new Singleton();}public static Singleton getInstance() {return SingletonHolder.INSTANCE;} }
- 原理:
- 静态内部类
SingletonHolder
在getInstance()
调用时才加载,触发INSTANCE
初始化。 - JVM确保类加载过程线程安全,无需额外同步。
- 静态内部类
- 优点:
- 延迟加载,节省内存。
- 线程安全,无需加锁,性能高。
- 实现优雅,代码简洁。
- 缺点:
- 无法传递参数给构造方法(除非通过其他方式)。
- 适用场景:需要延迟加载且要求高性能的场景,推荐使用。
5. 枚举(Enum)
- 特点:使用Java枚举类型实现单例,简洁且天然线程安全。
- 线程安全:由JVM保证枚举实例的单例性。
- 代码示例:
public enum Singleton {INSTANCE;// 可添加方法public void doSomething() {System.out.println("Singleton method called");} }
- 使用方式:
Singleton.INSTANCE.doSomething();
- 使用方式:
- 优点:
- 实现最简单,代码极少。
- 线程安全,由JVM保证。
- 防止反射攻击和序列化问题(枚举天生防止反序列化创建新实例)。
- 支持添加方法,功能灵活。
- 缺点:
- 非延迟加载,枚举类加载时即创建实例。
- 不支持复杂构造逻辑(枚举构造较为固定)。
- 适用场景:需要绝对线程安全、防止反射/序列化问题、逻辑简单的场景。
6. 对比总结
方式 | 延迟加载 | 线程安全 | 性能 | 复杂性 | 防止反射/序列化 | 适用场景 |
---|---|---|---|---|---|---|
懒汉式 | 是 | 否/是(加锁) | 低(锁) | 低 | 需额外处理 | 单线程或低并发 |
饿汉式 | 否 | 是 | 高 | 低 | 需额外处理 | 确定使用、无内存限制 |
双重检查锁 | 是 | 是 | 高 | 高 | 需额外处理 | 高并发、延迟加载 |
静态内部类 | 是 | 是 | 高 | 中 | 需额外处理 | 高性能、延迟加载,推荐 |
枚举 | 否 | 是 | 高 | 低 | 天然支持 | 简单逻辑、防反射/序列化,推荐 |
7. 注意事项
- 私有构造:所有实现都需私有构造方法,防止外部实例化。
- 反射攻击:除枚举外,其他方式可能通过反射创建实例,需在构造方法中加防护:
private Singleton() {if (instance != null) {throw new RuntimeException("Instance already exists!");} }
- 序列化问题:除枚举外,单例实现序列化时需实现
readResolve
方法:private Object readResolve() {return instance; }
- Spring中的单例:Spring的单例是容器级别的,生命周期由Spring管理,通常无需手动实现单例模式。
8. 推荐方式
- 首选:静态内部类(延迟加载、线程安全、实现优雅)。
- 次选:枚举(最简单、防反射/序列化,适合简单场景)。
- 高并发:双重检查锁(需确保正确使用
volatile
)。 - 确定使用:饿汉式(简单直接)。
- 避免:懒汉式(除非单线程或加锁优化)。
相关文章:
【Spring】单例模式的创建方式(Bean解析)
在Java中,单例模式(Singleton Pattern)确保一个类只有一个实例,并提供全局访问点。以下是实现单例的五种常见方式:懒汉式、饿汉式、双重检查锁、静态内部类和枚举,包括代码示例和优缺点分析。 1. 懒汉式&am…...
小小矩阵设计
在电气设计图中,矩阵设计的接线方法是通过结构化布局实现多灵活链接的技术,常用于信号切换、配电调压或更加复杂的控制场景。 今天聊一种在电气图纸中用到的一种简单矩阵接法,一眼就看明白,很大程度简化了程序控制点和继电器的使用…...
IOT项目——双轴追光系统
双轴太阳能追光系统 - ESP32实现 系统概述 这个系统使用: ESP32开发板2个舵机(水平方向和垂直方向)4个光敏电阻(用于检测光照方向)适当的电阻(用于光敏电阻分压) 接线示意图 --------------…...
深度学习基石:神经网络核心知识全解析(一)
神经网络核心知识全解析 一、神经网络概述 神经网络作为机器学习领域的关键算法,在现代生活中发挥着重要作用,广泛应用于图像识别、语音处理、智能推荐等诸多领域,深刻影响着人们的日常生活。它通过模拟人类大脑神经系统的结构和功能&#…...
什么是 金字塔缩放(Multi-scale Input)
金字塔缩放 什么是金字塔缩放(Multi-scale Input)什么场景下会用到金字塔缩放?图像识别目标跟踪图像压缩视频处理如何在计算机程序中实现金字塔缩放?准备数据缩小数据(构建金字塔的上层)存储数据使用数据(在程序中应用金字塔缩放)金字塔缩放的记忆卡片什么是金字塔缩放(M…...
从零开始配置 Zabbix 数据库监控:MySQL 实战指南
Zabbix作为一款开源的分布式监控工具,在监控MySQL数据库方面具有显著优势,能够为数据库的稳定运行、性能优化和故障排查提供全面支持。以下是使用Zabbix监控MySQL数据库的配置。 一、安装 Zabbix Agent 和 MySQL 1. 安装 Zabbix Agent services:zabbix…...
机器学习超参数优化全解析
机器学习超参数优化全解析 摘要 本文全面深入地剖析了机器学习模型中的超参数优化策略,涵盖了从参数与超参数的本质区别,到核心超参数(如学习率、批量大小、训练周期)的动态调整方法;从自动化超参数优化技术…...
【算法】双指针8道速通(C++)
1. 移动零 思路: 拿示例1的数据来举例,定义两个指针,cur和dest,cur表示当前遍历的元素,dest以及之前表示非零元素 先用cur去找非零元素,每找到一个非零元素,就让dest的下一个元素与之交换 单个…...
synchronized锁
在了解锁之前我们要先了解对象布局 什么是java对象布局 在JVM中,对象在内存中存储的布局可以分为三块区域,即实例化之后的对象 对象头:分配的空间是固定的12Byte,由Mark Word(标记字段)和Class Pointer&…...
实训Day-2 流量分析与安全杂项
目录 实训Day-2-1流量分析实战 实训目的 实训任务1 SYN半链接攻击流量分析 实训任务2 SQL注入攻击流量分析一 实训任务3 SQL注入攻击流量分析二 实训任务4 Web入侵溯源一 实训任务5 Web入侵溯源二 编辑 实训Day-2-1安全杂项实战 实训目的 实训任务1 流量分析 FTP…...
LOH 怎么进行深度标准化?
The panel of normals is applied by replacing the germline read depth of the sample with the median read depth of samples with the same genotype in our panel. 1.解释: panel of normal 正常组织,用于识别技术噪音 germline read depth: 胚系测序深度。根…...
[预备知识]3. 自动求导机制
自动求导机制 本章节介绍 PyTorch 的自动求导机制,包括计算图、反向传播和梯度计算的原理及实现。 1. 计算图原理 计算图是深度学习框架中的一个核心概念,它描述了计算过程中各个操作之间的依赖关系。 计算图由节点(节点)和边…...
蓝桥杯中的知识点
总结: 这次考的并不理想 比赛前好多知识点遗漏 但到此为止已经结束了 mod 是 模运算(Modulo Operation)的缩写,表示求两个数相除后的 余数 10mod31 (a % b) (7%21) 1e9代表1乘以10的9次方,…...
2023蓝帽杯初赛内存取证-6
这里需要用到pslist模块,结合一下查找关键词: vol.py -f memdump.mem --profile Win7SP1x64 pslist | grep -E "VeraCrypt" 将2023-06-20 16:47:41 UTC0000世界标准时间转换成北京时间: 答案:2023-06-21 00:47:41...
《MySQL 核心技能:SQL 查询与数据库概述》
MySQL 核心技能:SQL 查询与数据库概述 一、数据库概述1. 什么是数据库2.为什么要使用数据库3.数据库的相关概念3.1 数据库(DB):数据的“仓库”3.2 数据库管理系统(DBMS):数据库的“管家”3.3 SQ…...
三维几何变换
一、学习目的 了解几何变换的意义 掌握三维基本几何变换的算法 二、学习内容 在本次试验中,我们实现透视投影和三维几何变换。我们首先定义一个立方体作为我们要进行变换的三维物体。 三、具体代码 (1)算法实现 // 获取Canvas元素 con…...
TDengine 查询引擎设计
简介 TDengine 作为一个高性能的时序大数据平台,其查询与计算功能是核心组件之一。该平台提供了丰富的查询处理功能,不仅包括常规的聚合查询,还涵盖了时序数据的窗口查询、统计聚合等高级功能。这些查询计算任务需要 taosc、vnode、qnode 和…...
15.第二阶段x64游戏实战-分析怪物血量(遍历周围)
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 上一个内容:14.第二阶段x64游戏实战-分析人物的名字 如果想实现自动打怪,那肯定…...
vue浅试(1)
先安装了vue nvm安装详细教程(安装nvm、node、npm、cnpm、yarn及环境变量配置) 稍微了解了一下cursor cursor的使用 请出我们的老师: 提示词: 你是我的好朋友也是一个前端专家,你能向我传授前端知识,…...
VSCode连服务器一直处于Downloading
使用vscode的remote插件连接远程服务器时,部分服务器可能会出现一直处于Downloading VS Code Server的情况 早期的一些教程,如https://blog.csdn.net/chongbin007/article/details/126958840, https://zhuanlan.zhihu.com/p/671718415给出的方法是手动下…...
QGIS实用功能:加载天地图与下载指定区域遥感影像
QGIS 实用功能:加载天地图与下载指定区域遥感影像 目录标题 QGIS 实用功能:加载天地图与下载指定区域遥感影像一、安装天地图插件,开启地图加载之旅二、获取天地图密钥,获取使用权限三、加载天地图服务,查看地图数据四…...
mybatis-plus开发orm
1、mybatis 使用mybatis-generator自动生成代码 这个也是有系统在使用 2、mybatis-plus开发orm--有的系统在使用 MybatisPlus超详细讲解_mybatis-plus-CSDN博客...
ubuntu 交叉编译 macOS 库, 使用 osxcross 搭建 docker 编译 OS X 库
1. ubuntu 交叉编译 macOS 库, 使用 osxcross 搭建 docker 编译 OS X 库 1. ubuntu 交叉编译 macOS 库, 使用 osxcross 搭建 docker 编译 OS X 库 1.1. 安装依赖1.2. 安装 osxcross 及 macOS SDK 1.2.1. 可能错误 1.3. 编译 cmake 类工程1.4. 编译 configure 类工程1.5. 单文件…...
抱佛脚之学SSM四
MyBatis基础 一个接口对应一个映射文件 在映射文件中指定对应接口指定的位置 sql语句中id对应方法名par..参数的类型,resul..返回值的类型 WEB-INF下的文件是受保护的,不能直接访问,只能通过请求转发的方式访问 SqlSessionFactory࿱…...
2.5 函数的拓展
1.匿名函数(简化代码) python中没有这个概念,通过lambda关键字可以简化函数的代码写法 2.lambda表达式 arguments lambda 参数列表 : 函数体 print(aarguments(参数)) #测试lambda #原本代码def sum1(x,y):return xyprint(sum1…...
深度学习--卷积神经网络数据增强
文章目录 一、数据增强1、什么是数据增强?2、为什么需要数据增强? 二、常见的数据增强方法1、图像旋转2、图像翻转3、图像缩放4、图像平移5、图像剪切6、图像亮度、对比度、饱和度调整7、噪声添加8、随机扰动 三、代码实现1、预处理2、使用数据增强增加训…...
Buffer of Thoughts: Thought-Augmented Reasoningwith Large Language Models
CODE: NeurIPS 2024 https://github.com/YangLing0818/buffer-of-thought-llm Abstract 我们介绍了思想缓冲(BoT),一种新颖而通用的思想增强推理方法,用于提高大型语言模型(大型语言模型)的准确性、效率和鲁棒性。具体来说,我们提出了元缓冲…...
mybatisX动态切换数据源直接执行传入sql
代码 mapper接口中方法定义如下,其中#dbName代表传入的数据源变量(取值可参考application.properties中spring.datasource.dynamic.datasource指定的数据源) DS("#dbName")List<LinkedHashMap<String, Object>> execu…...
N8N MACOS本地部署流程避坑指南
最近n8n很火,就想在本地部署一个,尝尝鲜,看说明n8n是开源软件,可以在本地部署,于是就尝试部署了下,大概用了1个多小时,把相关的过程记录一下: 1、基础软件包 abcXu-MacBook-m2-Air…...
搜索策略的基本概念
搜索是人工智能中的一个基本问题,是推理不可分割的一部分,它直接关系到智能系统的性能与运行效率,因而尼尔逊把它列为人工智能研究中的四个核心问题之一。在过去40多年中,人工智能界已对搜索技术开展了大量研究,取得了…...
云原生--CNCF-1-云原生计算基金会介绍(云原生生态的发展目标和未来)
1、CNCF定义与背景 云原生计算基金会(Cloud Native Computing Foundation,CNCF)是由Linux基金会于2015年12月发起成立的非营利组织,旨在推动云原生技术的标准化、开源生态建设和行业协作。其核心目标是通过开源项目和社区协作&am…...
【Chrome插件开发】某视频网站的m4s视频/音频下载方案,及其Chrome插件实现-v250415
文章目录 引言效果v1.0.0 TODO让AI写初稿两条路:在content.js里,还是popup.js里发请求?World in content.js新建项目如何打包background.js:在鼠标右键菜单添加一个选项,点击后通知content.js第一次创建弹窗eslint 9如…...
Nginx:前后端分离配置(静态资源+反向代理)
Nginx 前后端分离配置 [!IMPORTANT] 前端静态资源位置:/www/wwwroot/dist后端部署端口:9999 server {listen 80;server_name www.0ll1.com;location / {root /www/wwwroot/dist;try_files $uri $uri/ /index.html;index index.html index.htm;…...
go中map和slice非线程安全
参考视频:百度 Go二面: map与切片哪个是线程安全的_哔哩哔哩_bilibili go中的map和slice是非线程安全类型的。 非线程安全类型的表现为: 并发调用时会报错并发调用后结果不可预测 go中三种线程安全类型: channel,底…...
第T9周:猫狗识别2
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 第T9周:猫狗识别2 tf.config.list_physical_devices(“GPU”),用于检测当前系统是否有可用的 GPU,并将结果存入 gpus 变量…...
AlmaLinux 9.5 调整home和根分区大小
在使用linux的过程中, 有时会出现因为安装系统时分区不当导致有的分区空间不足,而有的分区空间过剩的情况.下面本文将讲述解决linux系统AlmaLinux 下调整home和根分区大小的方法。 1、查看现有分区 df -Th2、备份/home中的用户数据 mkdir /backup && mv /home/* /ba…...
[Vue3]绑定props 默认值
前言 使用TS、Vue3组织组件中传入props的通用方式 步骤 步骤1:使用 defineProps 定义 Props 使用interface定义props中各项的类型: // 组件List.vue// 定义 Props 类型和接口 interface ListItem {name: string;time: string;content: {status: numbe…...
【android bluetooth 协议分析 11】【AVDTP详解 1】【宏观感受一下avdtp是个啥东东】
我们先从宏观感受一下avdtp协议是个啥东东, 和 a2dp 是啥关系。 在蓝牙协议中的层次。以及他是如何和 例如l2cap 、sdp、a2dp 配合的。先从宏观把握,我们在逐步展开对 avdtp 的源码分析。 我们先从生活中的小例子感性的认识一下 avdtp 在 蓝牙协议中的作…...
【MATLAB第116期】基于MATLAB的NBRO-XGBoost的SHAP可解释回归模型(敏感性分析方法)
【MATLAB第116期】基于MATLAB的NBRO-XGBoost的SHAP可解释回归模型(敏感性分析方法) 引言 该文章实现了一个可解释的回归模型,使用NBRO-XGBoost(方法可以替换,但是需要有一定的编程基础)来预测特征输出。该…...
【Spring】静态代理、动态代理
Java中,代理模式是一种设计模式,用于通过代理对象控制对目标对象的访问。代理可以分为静态代理和动态代理,其中动态代理又包括JDK动态代理和CGLIB动态代理。这些机制在Spring框架中广泛用于AOP(面向切面编程)、事务管理…...
关于el-table可展开行实现懒加载的方案
场景: 一个流程记录,以表格的形式展示。点击展开表格的某一行,可以看到该流程的详细记录。但是,详细记录数据独立于表格数据,在还没有展开这一行的时候就不去请求这一行的详细数据,以便加快网络请求的速度。…...
AutoJs相关学习
一、控件点击、模拟点击 如果一个控件的 clickablefalse,但它的父级控件是 clickabletrue,我们可以通过 向上查找父级控件 的方式找到可点击的父级,然后执行点击操作。以下是几种实现方法: 方法 1:使用 parent() 查找可…...
ISO15189认证有什么要求?ISO15189认证流程
ISO 15189 认证要求及流程详解 ISO 15189 是国际标准化组织(ISO)针对 医学实验室质量和能力 的认证标准,适用于医院检验科、第三方医学实验室、血站等机构。该认证确保实验室的技术能力和管理体系符合国际标准,提高检测结果的准确…...
【每天一个知识点】大模型的幻觉问题
“大模型的幻觉问题”是指大语言模型(如GPT系列、BERT衍生模型等)在生成内容时,产生不符合事实或逻辑的虚假信息,即所谓的“幻觉”(hallucination)。这在诸如问答、摘要、翻译、代码生成等任务中尤其常见。…...
光谱相机在肤质检测中的应用
光谱相机在肤质检测中具有独特优势,能够通过多波段光谱分析皮肤深层成分及生理状态,实现非侵入式、高精度、多维度的皮肤健康评估。以下是其核心应用与技术细节: 一、工作原理 光谱反射与吸收特性: 血红蛋白&a…...
【c语言】指针和数组笔试题解析
一维数组: //数组名a如果既不单独放在sizeof()中,也不与&结合,那么就表示数组首元素的大小 //a一般表示数组首元素地址,只有两种情况表示整个数组,sizeof(arr)表示整个数组的大小,&arr表示数组的地址 int a[]…...
【Spring】AutoConfigureOrder与Order注解的区别与使用方式
@AutoConfigureOrder与@Order都是Spring框架中用于控制组件优先级的注解,但它们有不同的应用场景和作用范围。 一、基本区别 1. 包和位置 @Order: 位于org.springframework.core.annotation包,是Spring核心包的一部分@AutoConfigureOrder: 位于org.springframework.boot.au…...
基于SpringBoot的校园赛事直播管理系统-项目分享
基于SpringBoot的校园赛事直播管理系统-项目分享 项目介绍项目摘要管理员功能图用户功能图项目预览首页总览个人中心礼物管理主播管理 最后 项目介绍 使用者:管理员、用户 开发技术:MySQLJavaSpringBootVue 项目摘要 随着互联网和移动技术的持续进步&…...
科研小白可以做哪些准备
断更五个月啦,这段时间一直忙于自己的研究课题。今天给大家分享我在这段时间对科研的一些认识和积累的经验,希望对大家有所帮助。 一、学术研究的认识与思考 什么是科研 什么是好的研究 首先,就是要回答“什么是科研?什么是好研…...
2025.4.22学习日记 JavaScript的常用事件
在 JavaScript 里,事件是在文档或者浏览器窗口中发生的特定交互瞬间,例如点击按钮、页面加载完成等等。下面是一些常用的事件以及案例: 1. click 事件 当用户点击元素时触发 const button document.createElement(button); button.textCo…...