一、饿汉模式
public class SingleOne {
public static SingleOne singleOne=new SingleOne();
}
优点:多线程安全
缺点:项目启动慢,因为第一次加载需要实例化,且违背了Java随用随加载的原则
二、懒汉模式
public class SingleTwo {
private static SingleTwo singleTwo;
public static SingleTwo getInstance() {
if (singleTwo == null) {
singleTwo = new SingleTwo();
}
return singleTwo;
}
}
优点:实现了随用随加载
缺点:多线程不安全,如果遇见多线程,可能被多次实例化
解决:在getInstance处加入synchronized,但是缺点就是效率不高,因为每次调用都会同步
三、DCL单例
public class DCLSingle {
private static DCLSingle instance;
private DCLSingle() {
}
public static DCLSingle getInstance(){
if(instance==null){
synchronized (DCLSingle.class) {
if(instance==null){
instance=new DCLSingle();
}
}
}
return instance;
}
}
绝大多数情况下是安全的,但是在高并发的情况下回被实例化两次
原因:jvm调用机制的问题,指令集乱序
解决:可给DCLSingle静态对象加volatile,但是效率低
四、优雅的单例模式
public class SingleThree {
private SingleThree() {
}
private static class SingleHolder{
private static final SingleThree instance=new SingleThree();
}
public static SingleThree getInstance(){
return SingleHolder.instance;
}
}
优点:线程安全,随用随加载,不会被多次实例化