单例模式作为设计模式之一,有饿汉式单例,懒汉式单例,静态内部类式单例,枚举式,检测双重锁单例
这里写的是双重锁单例
public class SingletionDCL{
private volatile static SingletionDCL mInstance;
private SingletionDCL(){}
public static SingletionDCL getmInstance(){
if (mInstance == null) {
synchronize(SingletionDCL.class){
if (mInstance == null) {
mInstance = new SingletionDCL();
}
}
}
return mInstance;
}
}
如果不加volatile关键字会造成什么问题
为什么要加volatile呢,因为在
mInstance = new SingletionDCL();
这句话中,这段代码是分三步进行的
1.为mInstance申请内存空间
2.初始化mInstance
3.讲mInstance指向分配的内存地址
JVM又有指令重排的特性,顺序有可能就是1->3->2的顺序,在单线程没什么问题,但是在多线程的话,就会发生一个线程获得还没初始化的实例,比如线程A执行了1,3步,这个时候线程B来执行getmInstance方法,就会获得一个没初始化的mInstance。而volitate关键字可以禁止jvm的指令重排,这样子就可以保证在多线程环境下执行。