所有单例模式需要处理得问题都是:
将构造函数私有化
通过静态方法获取一个唯一实例
保证线程安全
防止反序列化造成的新实例等。
推荐使用:静态内部类,DCL
静态内部类实现,线程安全
public class SingletonDemo {
private static class SingletonHolder{
private static SingletonDemo instance=new SingletonDemo();
}
private SingletonDemo(){
System.out.println("Singleton has loaded");
}
public static SingletonDemo getInstance(){
return SingletonHolder.instance;
}
protected Object readResolve() { //解决反序列化时产生多个对象
System.out.println("调用了readResolve方法");
return InnerClass.singletonStaticInnerSerialize;
}
}
DCL双重所机制
public class SingletonDemo {
private static volatile SingletonDemo instance;
private SingletonDemo(){
System.out.println("Singleton has loaded");
}
public static SingletonDemo getInstance(){
if(instance==null){
synchronized (SingletonDemo.class){
if(instance==null){
instance=new SingletonDemo();
}
}
}
return instance;
}
}