DLC(雙重檢查鎖)+volatile關(guān)鍵字實(shí)現(xiàn):
public class Singleton { //高并發(fā)情況下的安全單例
private static volatile Singleton instance; //禁止初始化對(duì)象過(guò)程中的指令的重排序
private Singleton(){}
public static Singleton getInstance(){//DCL 雙重檢查鎖
if(instance == null){//第一次檢查是看看instance是否被創(chuàng)建了
synchronized (Singleton.class){ //之所以不將方法設(shè)為synchronize是為了減少開(kāi)銷(xiāo)
if(instance == null){//第二次檢查是防止多個(gè)線(xiàn)程同時(shí)準(zhǔn)備創(chuàng)建instance的情況
instance = new Singleton();
}
}
}
return instance;
}
}
使用靜態(tài)Holder類(lèi)
public class Singleton {
//靜態(tài)內(nèi)部Holder類(lèi)的實(shí)現(xiàn)
private Singleton(){}
public static Singleton getInstance(){
return Holder.mInstance;
}
private static class Holder{ //由類(lèi)加載器加載類(lèi)的時(shí)候保證線(xiàn)程安全 加載類(lèi)的時(shí)候會(huì)上鎖
public static Singleton mInstance = new Singleton(); //靜態(tài)成員只有在第一次被引用的時(shí)候才會(huì)執(zhí)行初始化 并且只初始化一次 節(jié)約開(kāi)銷(xiāo)
}
}
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。