单例模式在不考虑序列化的情况下,无论勤加载还是懒加载,均是安全的.看你代码是怎么写的了.
但当单例执行了Serializiable接口以后,就不安全了. 将单例序列化再反序列化, 单例就多了一份copy.
但这个问题也不是不能解决,常用的方法有两种:
一. readResolve
public class Singleton implements Serializable {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {
}
private Object readResolve() {
//readUnshared 返回该对象的浅表副本
return INSTANCE;
}
public static Singleton getInstance() {
return INSTANCE;
}
}
当进行反序列化时, ois.readObject();时内部就是通过反射检查implements Serializable的类有没有
readResolve方法,如果有就把readResolve的返回值作为ois.readObject();的返回值. 所以readResolve必须返回之前对象的引用
二. 使用枚举式
使用了枚举特有的特性, 枚举序列化, 反序列化的对象然后是同一个对象. 可以自行查看ois.readObject();oos.writeObject(obj)代码, 它是
把枚举作为一种类型单独考虑的.
|