单例模式的隐秘危机

引言

单例模式作为设计模式中的基石,广泛应用于配置管理、线程池、缓存系统等关键场景。然而,许多开发者误以为“私有构造函数”足以保障其唯一性,却忽视了反射机制、对象克隆、序列化反序列化这三把“隐形利刃”——它们能绕过常规防御,悄无声息地创建多个实例,引发数据污染、资源竞争等灾难性后果。

单例模式的破坏

反射

反射可以访问和修改类的私有构造函数,从而创建新的实例,破坏单例约束。

解决办法:

  1. 构造方法内判断已经实例化过了,如果已经实例化过了,第二次实例化的时候,抛出异常。
  2. 使用枚举创建单例对象。
private Singleton() {if (SingletonHolder.INSTANCE != null) {throw new RuntimeException("不允许通过反射创建实例");}
}

克隆

如果单例类实现了Cloneable接口,并且没有覆盖clone方法,则可以通过克隆创建多个实例。

解决办法:

  1. 重写clone()方法,调clone()时直接返回已经实例的对象。
  2. 使用枚举创建单例对象。

序列化

序列化和反序列化可以创建单例类的新实例,破坏单例约束。java.io.ObjectInputStream 在反序列化过程中调用的。如果一个类实现了 Serializable 接口,并提供了 readResolve 方法,那么在该类的实例被反序列化时,readResolve 方法会被调用,以提供最终返回的对象。

解决办法:

  1. 在反序列化时的回调方法 readResolve()中返回单例对象。
  2. 使用枚举创建单例对象。

感谢您的阅读!如果文章中有任何问题或不足之处,欢迎及时指出,您的反馈将帮助我不断改进与完善。期待与您共同探讨技术,共同进步!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/907477.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DMBOK对比知识点对比(3)

1.数据仓库建设方法(Inmon、Kimball) 数据仓库建设方法(Inmon、Kimball)P293方法

Python+VR:如何让虚拟世界更懂你?——用户行为分析的实践

友友们好! 我是Echo_Wish,我的的新专栏《Python进阶》以及《Python!实战!》正式启动啦!这是专为那些渴望提升Python技能的朋友们量身打造的专栏,无论你是已经有一定基础的开发者,还是希望深入挖掘Python潜力的爱好者,这里都将是你不可错过的宝藏。 在这个专栏中,你将会…

游戏引擎学习第311天:支持手动排序

仓库: https://gitee.com/mrxiao_com/2d_game_7(已满) 新仓库: https://gitee.com/mrxiao_com/2d_game_8 回顾并为今天的内容定下基调 我们接下来要继续完成之前开始的工作,上周五开始的部分内容,虽然当时对最终效果还不太确定,但现在主要任…

数据结构第2章绪论 (竟成)

第 2 章 绪论 本章主要介绍数据结构相关的一些基本概念,是后续章节的基础。我们也将 408 考试大纲中,关于数据结构部分的考查目标罗列在这里,供各位考生参考: 1.掌握数据结构的基本概念、基本原理和基本方法。 2.掌握数据的逻辑结…

spring boot 拦截器HandlerInterceptor 不生效的原因排查

public class UserInterceptor implements HandlerInterceptor项目添加一个拦截器,发现未生效 1、排查拦截本身是否注入了springbean 容器 Slf4j Component public class LoginInterceptor implements HandlerInterceptor {2、排查springboot 项目扫描范围是否包含…

用Python绘制动态爱心:代码解析与浪漫编程实践

用Python绘制动态爱心:代码解析与浪漫编程实践 一、摘要二、整体架构流程1. 初始化配置模块2. 几何绘制引擎3. 动画控制系统4. 辅助功能模块三、技术细节解析1. Turtle性能优化2. 数学公式应用3. 颜色渐变算法4. 异常处理机制5. 动画节奏控制四、结论与展望附:完整代码一、摘…

WPS 免登录解锁编辑

遇到 WPS 需要登录才能启用编辑功能? 如何免登录使用编辑功能? 方法一 解锁方法 1、关闭 WPS; 2、桌面右键→ “新建”→“文本文档”,粘贴以下内容(见最下面);编码保持默认(ANSI …

ORDER BY子句在一个 SQL 查询中只能出现一次

order by A.create_time,A.update_time desc和 order by A.create_time desc,A.update_time desc有区别吗? 关键区别 第一个排序中 create_time 是升序(默认是ASC),第二个是降序(DESC) 只有在 DESC 关键字紧跟在列名后面时,该列才会按降序排…

02-BTC-密码学原理 对hash算法如果出现漏洞的思考

如果比特币中某个哈希函数的抗碰撞性出现了漏洞怎么办,怎么补救? 答:(1)攻击场景: 伪造交易:攻击者可构造两个不同的交易(如正常交易和恶意双花交易)具有相同的TxID&…

特征分解:线性代数在AI大模型中的核心工具

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C++, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用…

华为OD机试真题——二叉树的广度优先遍历(2025A卷:200分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 200分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

[java八股文][JavaSpring面试篇]Mybatis

与传统的JDBC相比,MyBatis的优点? 基于 SQL 语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任 何影响,SQL 写在 XML 里,解除 sql 与程序代码的耦合,便于统一管理;提供 …

数据库 | 时序数据库选型

选型目标 高性能与低延迟:满足高频率数据写入与即时查询的需求。资源效率:优化存储空间使用,减少计算资源消耗。可扩展架构:支持数据量增长带来的扩展需求,易于维护。社区活跃度:有活跃的开发者社区&#…

MobaXterm连接Docker Desktop中的容器(shell)

对于使用docker desktop的同学,想要直连docker容器不需要借助ssh协议,可以直接通过shell访问控制台,配置如下: 选择terminal shell类型,我选择的是powershell 。 输入terminal启动命令:docker exec -it [你…

两个Ubuntu机器(内网)免密登录设置

业务背景:现有两个机器;A(192.168.1.10)、B(192.168.1.20); 需要机器A可以免密登录B,具体操作如下: 1、首先在机器A中,上生成 SSH 密钥对(公钥和私…

支持selenium的chrome driver更新到136.0.7103.113

最近chrome释放新版本:136.0.7103.113 如果运行selenium自动化测试出现以下问题,是需要升级chromedriver才可以解决的。 selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only s…

SQL中各个子句的执行顺序

select、from、 join、where、order by、group by、having、limit 解释 1) FROM (确定数据源) 查询的执行首先从FROM子句开始,确定数据的来源(表、视图、连接等)。 2) JOIN (如果有JOIN操作) 在FROM子句之后,SQL引擎会执行连接操作(JOIN)&#xff0c…

若依微服务的定制化服务

复制依赖 复制依赖 复制system服务的bootstrap.yml文件,修改port和name 在nacos复制一个新的nacos配置,修改对应的nacos的配置 ,可能不需要修改,看情况。 网关修改 注意curd的事项,模块名称的修改

用 Python 模拟下雨效果

用 Python 模拟下雨效果 雨天别有一番浪漫情怀:淅淅沥沥的雨滴、湿润的空气、朦胧的光影……在屏幕上也能感受下雨的美妙。本文将带你用一份简单的 Python 脚本,手把手实现「下雨效果」动画。文章深入浅出,零基础也能快速上手,完…

纯数据挖掘也能发Microbiome?

抗生素滥用导致多重耐药微生物在全球蔓延,但新型抗生素的研发进展缓慢,亟需找到替代抗生素的新型防御策略。抗菌肽(AMPs)作为天然防御分子,具有低耐药潜力和广谱活性。德国小蠊(Blattella germanica&#x…