附:单例模式的破坏

序列化对象对单例模式的破坏与恢复

首先这是一个饿汉式的单例对象构建方式,一般情况下获取到的都是同一个单例对象

但是当序列化写入本地再读入内存时,会重新创建一个单例对象

为什么会在读入序列化后的对象时会让单例模式失效呢?

这儿从readObject()方法入手

进入这个方法后:private Object readObject0(boolean unshared)

进入private Object readOrdinaryObject(boolean unshared)

进入newInstance()

发现原来在读入对象的时候,是通过反射重新构建了一个单例对象的实例,因此让单例模式失效了

 

 

如何让它重新有效呢?

将之前代码中的注释代码释放出来

通过这个方法便能够让读入的对象依旧是之前那个单例对象实例,这时候上面那个测试的结果就会变成true

还是进入这个方法中private Object readOrdinaryObject(boolean unshared)

在之前newInstance()那个方法的下面,即创通过对象

进入这个方法,可以看到会判断在需要读入的对象进行判断,如果有写readResolver方法,那么将会返回这个方法的返回值

 

 

通过反射进行单例模式的破坏和恢复

如果单例模式只是将构造方法设置为private(比如Runtime中单例实现),可以通过反射给这个方法设置访问权限进行访问构造方法,从而绕过单例模式构造出新的单例对象实例,破坏单例

可以在构造方法中判断INSTACE是否为空,如果已经创建过,那么将不会被继续被创建(注:这个只能够在饿汉式中满足条件,在懒汉式中,因为单例实例的创建是在第一次使用的时候创建的,如果反射操作在第一次获取操作的前面,那么将不能够保证获取的是同一个单例)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值