DLC(双重检查锁)+volatile关键字实现:
public class Singleton { //高并发情况下的安全单例
private static volatile Singleton instance; //禁止初始化对象过程中的指令的重排序
private Singleton(){}
public static Singleton getInstance(){//DCL 双重检查锁
if(instance == null){//第一次检查是看看instance是否被创建了
synchronized (Singleton.class){ //之所以不将方法设为synchronize是为了减少开销
if(instance == null){//第二次检查是防止多个线程同时准备创建instance的情况
instance = new Singleton();
}
}
}
return instance;
}
}
使用静态Holder类
public class Singleton {
//静态内部Holder类的实现
private Singleton(){}
public static Singleton getInstance(){
return Holder.mInstance;
}
private static class Holder{ //由类加载器加载类的时候保证线程安全 加载类的时候会上锁
public static Singleton mInstance = new Singleton(); //静态成员只有在第一次被引用的时候才会执行初始化 并且只初始化一次 节约开销
}
}