在文件写入Object实例时,导致了序列和反序列化,并且使得写入和独读出的对象不为同一个对象,因为在序列化过程中,会新创建对象,测试代码如下
package Singleton;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
public class Test {
public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
// Thread t1=new Thread(new T(),"Thread_1");
// Thread t2=new Thread(new T(),"Thread_2");
// t1.start();
// t2.start();
HungrySingleton instance=HungrySingleton.getInstance();
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(new File("Test")));
oos.writeObject(instance);
ObjectInputStream ois=new ObjectInputStream(new FileInputStream("Test"));
HungrySingleton newInstance=(HungrySingleton) ois.readObject();
System.out.println(instance==newInstance);
// TODO Auto-generated method stub
}
}
结果为:false。
但如果在HungrySingleton加上一个方法,就可以使其得到的是同一个对象
package Singleton;
import java.io.Serializable;
public class HungrySingleton implements Serializable {
private final static HungrySingleton instance=new HungrySingleton();
private HungrySingleton() {
}
public static HungrySingleton getInstance() {
return instance;
}
private Object readResolve() {
return instance;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
其实是重写了源码中的readResolve方法,得到的结果就是:true