双重检查懒加载
双重检查懒加载需要控制单例的可见性,多线程情况下可能出现空指针问题
/**
* 双重检查单例模式
*/
public class DoubleCheckSingleton {
//未使用volatile 可能在初始化的时候出现内存屏障内的指令重排,
// 导致后续线程读取到第一个判断时候获取到初始化的值,而不是单例的值
// private static DoubleCheckSingleton singleton;
/**
* 修改版本保证单例的可见性和指令重排的可能新性
*/
private static volatile DoubleCheckSingleton singleton;
private DoubleCheckSingleton(){}
public static DoubleCheckSingleton getInstance(){
if(null == singleton){
//初始化
synchronized (DoubleCheckSingleton.class){
if(null == singleton){
singleton = new DoubleCheckSingleton();
}
}
}
return singleton;
}
}
静态内部内加载
/**
* 静态内部类实现单例模式
*/
public class StaticInnerClassSingleton {
private StaticInnerClassSingleton(){}
private static class InstanceHolder{
final static StaticInnerClassSingleton SINGLETON = new StaticInnerClassSingleton();
}
public static StaticInnerClassSingleton getInstance(){
return InstanceHolder.SINGLETON;
}
}