码迷,mamicode.com
首页 > 其他好文 > 详细

GOF23—单例模式(2)

时间:2017-05-04 21:55:10      阅读:110      评论:0      收藏:0      [点我收藏+]

标签:不包含   模式   反序列化   包含   单例   反序   添加   懒汉   http   

本文介绍单例模式(不包含枚举单例模式)漏洞问题以及如何防止漏洞

  1.反射可以破解单例模式,例子如下:

  技术分享

  技术分享

此时,我们运行Client类,发现s1和s2是一个对象,但s3和s4是不同的对象。

那么如何防止这种现象的发生呢,我们在私有化的构造方法里添加异常抛出,这样在对象存在的时候,通过反射调用私有化的构造方法,就会发生异常。

技术分享

  2.通过反序列化的方式破解

  —首先我们要让单例模式的类实现Serializable接口,这样才可以序列化。其次,用ObjectOuputStream将对象写入硬盘,在用ObjectInputStream

从硬盘中读出来。

  技术分享

  技术分享

看运行的结果我们可以得知,s3与s1不是一个对象。

针对这种通过反序列化破解单例的方法,我们应该如何避免呢。

  技术分享

将上面的方法,定义在单例模式的类中,则反序列化只会返回已经创建好的对象。

 

关于这五种单例模式在多线程下的效率关系,

恶汉式>静态内部类式>枚举式>双重检查锁式>懒汉式(因为加了同步)

关于如何选择合适的单例模式:

—单例对象占用资源少,不需要延时加载

    枚举式好于恶汉式

—单例对象占用资源大,需要延时加载

    静态内部类式 好于懒汉式

GOF23—单例模式(2)

标签:不包含   模式   反序列化   包含   单例   反序   添加   懒汉   http   

原文地址:http://www.cnblogs.com/yangfanasp/p/6809704.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!