单例模式详解

本文探讨了懒汉式单例模式在多线程下的并发问题,介绍了加锁解决方式以及其效率影响,随后介绍了双重校验锁和枚举单例的优缺点。最后,揭示了反射和序列化破坏单例模式的方法及其应对措施。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单例模式分为饿汉式跟懒汉式

饿汉式:在类加载时对instance进行赋值
在这里插入图片描述
懒汉式:当我们用到时再对instance进行赋值
在这里插入图片描述
现在我们假设在多线程状态下运行懒汉式会出现什么结果呢?
在这里插入图片描述

发现存在不一样的单例对象。
我们可以怎么去解决这个问题呢?
对加上一个锁
在这里插入图片描述
我们可以清楚的看见创建的单例对象都是一样的了
但仔细想想还有什么问题?
单例模式,单例,单例,我们只需要创建一次,更多的应该是查询而非创建一个单例,而加锁之后我们的getInstance变成了同步的了,没办法异步进行,这样子的话会导致我们的运行效率降低,对不对?

正因如此,我们的双重校验锁机制诞生了
在这里插入图片描述
创建单例模式的方式还可以通过枚举的方式,值得注意的是枚举里同样可以有方法体喔。
但是他是比较消耗性能的

我们可以如何去破坏单例模式呢
枚举类的单例模式暂时还未研究,等学完jvm再来

如何破解其他的单例模式
①、反射机制
解决办法
设置一个Boolean对象flag,初始值为false,在创建对象时,会去检查flag是否为flase,若为false则创建对象并将flag置为true,若为true直接抛出一个异常
②、序列化
解决办法,当我们反序列化时,会检查是否序列化对象是否有readReslove方法,若有则直接返回该方法返回值,若没有则new一个新的对象并返回

就到这啦,感谢小伙伴们的阅读

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值