通过反序列化方式得到的单例不一定全局唯一,处理方法为在单例类中添加readResolve()方法,单例代码如下:
package com.wdlily.test.singleton;
import java.io.ObjectStreamException;
import java.io.Serializable;
/**
* 单例
*
* @Author: hakeedra 19-3-14 下午2:50
*/
public class MainSingleton implements Serializable {
private MainSingleton(){}
private static class Singleton{
private static MainSingleton SINGLETON = new MainSingleton();
}
public static MainSingleton getSingleton(){
return Singleton.SINGLETON;
}
/**
* 访问权限为private/protected
* 返回值必须是Object
* 异常可以不抛
*
* @return
* @throws ObjectStreamException
*/
protected Object readResolve() throws ObjectStreamException {
return Singleton.SINGLETON;
}
}
测试代码如下:
package com.wdlily.test.singleton;
import java.io.*;
/**
* @Author: hakeedra 19-3-14 下午2:54
*/
public class SerializeTest {
public static void main(String[] args) {
MainSingleton singleton = MainSingleton.getSingleton();
System.out.println(singleton.hashCode());
File file = new File("/home/future/temp/singleton.test");
try {
FileOutputStream fos = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(singleton);
oos.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
FileInputStream fis = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(fis);
MainSingleton mainSingleton = (MainSingleton) ois.readObject();
System.out.println(mainSingleton.hashCode());
ois.close();
fis.close();
}catch (IOException | ClassNotFoundException e){
e.printStackTrace();
}
}
}