單例模式(Java)

線程安全的餓漢模式(強(qiáng)烈推薦)

public class Singleton {
    private Singleton(){}
    private static final Singleton instance = new Singleton();
    public static Singleton getInstance(){
        return instance;
    }
}

private static final Singleton instance = new Singleton();為什么要用static,因?yàn)間etInstance方法是static的(不用生成實(shí)例就能使用),靜態(tài)方法只能調(diào)用靜態(tài)成員,在類初始化時(shí)就實(shí)例化instance

線程安全的懶漢模式

public class Singleton {//雙重校驗(yàn)的懶漢,且線程安全
    private Singleton(){}
    private volatile static Singleton instance;(加volatile防止指令重排序)
    public static Singleton getInstance(){
        if(instance == null){//加鎖效率低,在已經(jīng)生成實(shí)例后,沒(méi)必要再判斷鎖
            synchronized(Singleton.class){//加鎖,防止多線程時(shí),生成多個(gè)實(shí)例
                if(instance == null){
                    instance = new Singleton();指令重排序,先完成賦值,但構(gòu)造函數(shù)還沒(méi)執(zhí)行完
                }
            }
        }
        return instance;
    }   
}

private volatile static Singleton instance;添加volatile關(guān)鍵字的原因:

instance = new Singleton();指令重排序,先完成賦值,但構(gòu)造函數(shù)還沒(méi)執(zhí)行完。

instance = new Singleton();可以分解為3行偽代碼

  1. memory=allocate();// 分配內(nèi)存 相當(dāng)于c的malloc
  2. ctorInstanc(memory) //初始化對(duì)象
  3. instance=memory //設(shè)置instance指向剛分配的地址

上面的代碼在編譯器運(yùn)行時(shí),可能會(huì)出現(xiàn)重排序 從1-2-3 排序?yàn)?-3-2
如此在多線程下就會(huì)出現(xiàn)問(wèn)題
例如現(xiàn)在有2個(gè)線程A,B
線程A在執(zhí)行第5行代碼時(shí),B線程進(jìn)來(lái),而此時(shí)A執(zhí)行了 1和3,沒(méi)有執(zhí)行2,此時(shí)B線程判斷instance不為null 直接返回一個(gè)未初始化的對(duì)象,就會(huì)出現(xiàn)問(wèn)題
而用了volatile,上面的重排序就會(huì)在多線程環(huán)境中禁止,不會(huì)出現(xiàn)上述問(wèn)題。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 單例:意思就是只有一個(gè)實(shí)例。單例模式確保某一個(gè)類只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。這個(gè)類稱為單...
    CoderZS閱讀 644評(píng)論 1 13
  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂(lè)視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,813評(píng)論 11 349
  • 單例模式 轉(zhuǎn)載原文鏈接-張新強(qiáng) [TOC] 單例對(duì)象的類必須保證只有一個(gè)實(shí)例存在 懶漢式:指全局的單例實(shí)例在第一次...
    Briarbear閱讀 269評(píng)論 1 0
  • 前言 java 常見(jiàn)的單例模式有三種: 懶漢: getInstance的時(shí)候?qū)嵗? 餓漢: 引用AA類的時(shí)候?qū)嵗?..
    嘰哩嘰哩雞閱讀 672評(píng)論 0 3
  • 1月15日精進(jìn) 今日體驗(yàn):不管在干什么話的同時(shí) 首先要找自己的不足 只有找到了 才能慢慢的成長(zhǎng) 慢慢的熟練 順力...
    小璇_c390閱讀 319評(píng)論 0 0

友情鏈接更多精彩內(nèi)容