單例模式

定義:確保一個類只有一個實列。
單列模式有幾個要點:
1、定義一個私有的構(gòu)造函數(shù)
2粘茄、一個私有的變量
3、公開的靜態(tài)的獲取實例的方法
4秕脓、確保多線程下實例化對象只有一個
將構(gòu)造方法私有化柒瓣,使得客戶端不能通過new的形式來獲取實例。單列會暴露一個獲取實例的靜態(tài)的方法獲取唯一的對象吠架。獲取單列需要線程安全芙贫,尤其是在多線程的環(huán)境下。
通常是用于該類需要消耗較多的資源或者沒有多個實例的情況傍药。

public class Singleton {
    //私有的成員變量
    private static Singleton mSingleton = new Singleton();
    //私有的構(gòu)造放啊發(fā)
    private Singleton(){}
    //對外公開獲取實例的方法
    public static Singleton getInstance() {
        return mSingleton;
    }
}

DCL方式實現(xiàn)單例

public class Singleton {
    
    private volatile static Singleton sInstance = null;
    private Singleton(){}
    
    public static Singleton getInstance() {
        if (sInstance != null) {
            synchronized (Singleton.class) {
                if (sInstance != null){
                    sInstance = new Singleton();
                }
            }
        }
        
        return sInstance;
    }
}

在獲取實例的時候進行了兩次判空磺平,為什么這么做呢,因為sInstance = new Singleton();這里看起來是一句代碼拐辽,但實際上并不是一個原子操作拣挪,這句這句代碼最終會被編譯成多條匯編指令,它大致做了三件事情:
1俱诸、給Sington實例分配內(nèi)存
2菠劝、調(diào)用Sington的構(gòu)造函數(shù),初始化成員
3乙埃、將sInstance引用執(zhí)行Sington的內(nèi)存地址
但是由于java編譯器是亂序執(zhí)行的闸英,第二第三步驟無法保證執(zhí)行順序,如果執(zhí)行的是3-2介袜,當這個線程執(zhí)行完成3之后甫何,另一個線程來取,但是這時候還未執(zhí)行2步驟遇伞,如果另個線程使用這個還未實例化的對象就會出現(xiàn)DCL(Double Check Lock)失效辙喂,所以加上volatitle關(guān)鍵字(用volatile修飾的變量,線程在每次使用變量的時候鸠珠,都會讀取變量修改后的最的值)巍耗,保證每次從內(nèi)存取。

  • 靜態(tài)內(nèi)部類的方式
    因為DCL單例模式會有一定概率早哼DCK失效渐排,所以不建議用這種方式炬太,而建議用下列方式:
public class Singleton {
    private Singleton() {}
    
    public static Singleton getInstance() {
        return SingletonHolder.sInstance;
    }
    
    public static class SingletonHolder {
        public static final Singleton sInstance = new Singleton();
    }
}

這種方式只有在調(diào)用getInstance方法的時候才去初始化SingletonHolder類,既保證了單一實例有保證了延時加載驯耻,還保證了線程安全亲族。

  • 優(yōu)點:
    1、單例模式全局只有實例可缚,減少了系統(tǒng)開銷霎迫,特別是一個類需要頻繁的創(chuàng)建銷毀而無法進行內(nèi)存優(yōu)化的時候。優(yōu)勢就特別明顯帘靡。
    2知给、單利模式為一個全局資源的訪問提供了便利。
  • 缺點:單例模式可擴展性差描姚。

補充:這樣的單利模式是餓漢模式涩赢,與之對應(yīng)的是懶漢模式,還有通過靜態(tài)內(nèi)聚類創(chuàng)建實例的轰胁。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谒主,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子赃阀,更是在濱河造成了極大的恐慌霎肯,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件榛斯,死亡現(xiàn)場離奇詭異观游,居然都是意外死亡,警方通過查閱死者的電腦和手機驮俗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門懂缕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人王凑,你說我怎么就攤上這事搪柑×浚” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵工碾,是天一觀的道長弱睦。 經(jīng)常有香客問我,道長渊额,這世上最難降的妖魔是什么况木? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮旬迹,結(jié)果婚禮上火惊,老公的妹妹穿的比我還像新娘。我一直安慰自己奔垦,他們只是感情好屹耐,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著椿猎,像睡著了一般张症。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鸵贬,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天俗他,我揣著相機與錄音,去河邊找鬼阔逼。 笑死兆衅,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的嗜浮。 我是一名探鬼主播羡亩,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼危融!你這毒婦竟也來了畏铆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤吉殃,失蹤者是張志新(化名)和其女友劉穎辞居,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛋勺,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡瓦灶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了抱完。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贼陶。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出碉怔,到底是詐尸還是另有隱情烘贴,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布撮胧,位于F島的核電站庙楚,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏趴樱。R本人自食惡果不足惜恼策,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一腹鹉、第九天 我趴在偏房一處隱蔽的房頂上張望牛哺。 院中可真熱鬧媳危,春花似錦问潭、人聲如沸萍启。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽永罚。三九已至啤呼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間呢袱,已是汗流浹背官扣。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留羞福,地道東北人惕蹄。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像治专,于是被迫代替她去往敵國和親卖陵。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理张峰,服務(wù)發(fā)現(xiàn)泪蔫,斷路器,智...
    卡卡羅2017閱讀 134,659評論 18 139
  • 單例模式(SingletonPattern)一般被認為是最簡單喘批、最易理解的設(shè)計模式撩荣,也因為它的簡潔易懂,是項目中最...
    成熱了閱讀 4,254評論 4 34
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,149評論 30 470
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,166評論 25 707
  • Y同學(xué)饶深,你好: 說實話婿滓,可能我真的是有些一廂情愿,但是還是想給自己一個機會粥喜,不讓自己后悔自己沒有爭取過凸主。 我想說Y...
    2017安好閱讀 240評論 0 1