一、饿汉式
import java.io.*;
public class HungrySingleton implements Serializable, Cloneable {
private static final HungrySingleton hungrySingleton = new HungrySingleton();
private HungrySingleton(){
System.out.println("返回单例模式对象");
}
public static HungrySingleton getInstance(){
return hungrySingleton;
}
/** 确保反序列化时,返回的对象为类初始化时的对象
* description:
* @return java.lang.Object
*/
private Object readResolve(){
return hungrySingleton;
}
@Override
public Object clone(){
return getInstance();
}
public static void main(String[] args) throws Exception{
HungrySingleton hungrySingleton = HungrySingleton.getInstance();
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("singleton_file"));
oos.writeObject(hungrySingleton);
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("singleton_file")));
HungrySingleton hungrySingleton1 = (HungrySingleton) ois.readObject();
System.out.println(hungrySingleton == hungrySingleton1);//如果不实现readResolve(),则返回结果为false,实现后,结果为true
HungrySingleton hungrySingleton2 =(HungrySingleton) hungrySingleton.clone();
System.out.println(hungrySingleton == hungrySingleton2);//如果不实现克隆接口,则返回接口为false,实现后返回结果为true
}
}
二、懒汉式
1)双重校验锁
public class DoubleCheckSingleton { private volatile static DoubleCheckSingleton doubleCheckSingleton; private DoubleCheckSingleton() { } public static DoubleCheckSingleton getInstance() { if (doubleCheckSingleton == null) { synchronized(DoubleCheckSingleton.class){ if(doubleCheckSingleton == null) { doubleCheckSingleton = new DoubleCheckSingleton(); } } } System.out.println(doubleCheckSingleton); return doubleCheckSingleton; } }
2)静态内部类
public class Singleton { private static class SingletonHolder{ private static final Singleton singleton = new Singleton(); } public static Singleton getInstance(){ return SingletonHolder.singleton; } public static void main(String[] args) { Singleton singleton = Singleton.getInstance(); Singleton singleton1 = Singleton.getInstance(); System.out.println(singleton == singleton1); } }