【转载】单例模式被反序列化而变多例

单例模式在不考虑序列化的情况下,无论勤加载还是懒加载,均是安全的。但当单例执行了Serializiable接口以后,就不安全了。将单例序列化再反序列化,单例就多了一份copy,变了了2个单例。(通过反序列化得到的对象是不同的对象,而且得到的对象不是通过构造器得到的, 也就是说反序列化得到的对象不执行构造器。)如何防止此事的发生?

两种方式解决此问题:

1, 对单例声明 transient Connection connection;然后实现readObject(ObjectInputStream in) 方法,复用原来的单例。

2, 实现readResolve()方法,返回原来单例。

注:Effective Java P15有同样的使用说明(第3条:用私有构造器或者枚举类型强化Singleton属性)。

猜你喜欢

转载自www.cnblogs.com/nachdenken/p/11716258.html