單例模式作為設(shè)計(jì)模式之一,有餓漢式單例,懶漢式單例,靜態(tài)內(nèi)部類(lèi)式單例,枚舉式,檢測(cè)雙重鎖單例
這里寫(xiě)的是雙重鎖單例
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關(guān)鍵字會(huì)造成什么問(wèn)題
為什么要加volatile呢,因?yàn)樵?/p>
mInstance = new SingletionDCL();
這句話(huà)中,這段代碼是分三步進(jìn)行的
1.為mInstance申請(qǐng)內(nèi)存空間
2.初始化mInstance
3.講mInstance指向分配的內(nèi)存地址
JVM又有指令重排的特性,順序有可能就是1->3->2的順序,在單線(xiàn)程沒(méi)什么問(wèn)題,但是在多線(xiàn)程的話(huà),就會(huì)發(fā)生一個(gè)線(xiàn)程獲得還沒(méi)初始化的實(shí)例,比如線(xiàn)程A執(zhí)行了1,3步,這個(gè)時(shí)候線(xiàn)程B來(lái)執(zhí)行g(shù)etmInstance方法,就會(huì)獲得一個(gè)沒(méi)初始化的mInstance。而volitate關(guān)鍵字可以禁止jvm的指令重排,這樣子就可以保證在多線(xiàn)程環(huán)境下執(zhí)行。