以懒汉单例设计模式为例,再类中添加 readResolve() 方法可防止通过反序列化破坏单例。
懒汉单例设计模式案例:
package com.singleton;
import java.io.ObjectStreamException;
import java.io.Serializable;
/**
* 懒汉单例设计模式案例
*/
public class SingletonDemo implements Serializable {
/**
* 懒加载
*/
private static SingletonDemo instance;
/**
* 私有构造器
*/
private SingletonDemo() {
// 防止通过反射实例对象而跳过getInstance()方法
if (instance != null) {
throw new RuntimeException("Object has been Instance !!!");
}
}
/**
* 调用方法才加载类,资源利用率高了,但要保证线程安全
*/
public static synchronized SingletonDemo getInstance() {
if (instance == null) {
instance = new SingletonDemo();
}
return instance;
}
/**
* 提供readResolve()方法
* 当JVM反序列化恢复一个新对象时,系统会自动调用readResolve()方法返回指定好的对象
* 从而保证系统通过反序列化机制不会产生多的Java对象
*
* @return 单例对象
* @throws ObjectStreamException 异常
*/
private Object readResolve() throws ObjectStreamException {
return instance;
}
}
测试用例:
package com.singleton;
import org.junit.Test;
import java.io.FileInputStream;
import java.io.FileOutputStre