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