样例代码
public class DanLi implements Serializable {
private DanLi(){}
//饿汉模式:不能懒加载,会造成内存开销,线程安全
private static DanLi instance1=new DanLi();
public static DanLi getInstance1(){
return instance1;
}
private static DanLi instance2;
//懒汉模式:线程不安全
public static DanLi getInstance2(){
if(instance2==null)
instance2=new DanLi();
return instance2;
}
//懒汉模式:线程安全,但每次调用同步方法会造成不必要的同步开销
public static synchronized DanLi getInstance3(){
if(instance2==null)
instance2=new DanLi();
return instance2;
}
//DCL-双重检查模式:线程安全,性能比起上面三种较好,只是有些情况下会失效
public static DanLi getInstance4(){
if(instance2==null){
synchronized (DanLi.class){
if (instance2==null){
instance2=new DanLi();
}
}
}
return instance2;
}
//静态内部类:线程安全,性能好,首选
public static DanLi getInstance5(){
return DanLiHolder.mInstance;
}
private static class DanLiHolder{
private static final DanLi mInstance=new DanLi();
}
//反序列化时杜绝重新生成对象
private Object readResolve() throws ObjectStreamException{
return instance2;
}
}
还有一种枚举模式,默认其所有实例都是线程安全的,只是可读性并不高,就不介绍了