單例模式

單例模式的目的

創(chuàng)建對象,確保對象的唯一性赁炎,在同一個系統(tǒng)中醉箕,對象只有一個實例.讓類自己負(fù)責(zé)保存它的唯一實例钾腺,提供一個訪問實例的方法.

單例模式概述

單例模式(Singleton Pattern):單例模式確保某一個類只有一個實例徙垫,而且自行實例化并向整個系統(tǒng)提供這個實例,這個類稱為單例類放棒,它提供全局訪問的方法姻报。

要點

  • 類只能有一個實例
  • 類自己負(fù)責(zé)創(chuàng)建實例
  • 提供訪問實例的方法

實現(xiàn)分類

  • 餓漢式
  • 懶漢式

餓漢式

pulic class Singleton{
  //唯一實例
  private static Singleton instance = new Singleton();

  //只能由類自己負(fù)責(zé)創(chuàng)建實例
  private Singleton(){

  }

}
//外部訪問實例的方法
public static getInstance(){
  return instance;
}

從代碼中可以看出,在定義靜態(tài)變量的時候就實例化了單例類.在類加載的時候间螟,靜態(tài)方法會先加載吴旋,所以單例對象在類加載的時候九被創(chuàng)建了,靜態(tài)變量只加載一次厢破,可以保證單例對象的唯一性荣瑟,并且是線程安全的.但是在類加載的時候就創(chuàng)建,會影響程序的效率.

懶漢式

public class Singleton{
  //唯一實例
  private static Singleton instance = null;

  //只能由類自己負(fù)責(zé)創(chuàng)建實例
  private Singleton(){

  }

  //外部訪問實例的方法
  public static getInstance(){
    if (interface  == null)
        instance = new Singleton();
    }
    return instance;
  }    
}

懶漢式在需要的時候才實例化,在類加載的時候不進(jìn)行實例化,能起到懶加載的作用详幽,但是如果在多線程的情況下橄仍,比如線程A和線程B同時調(diào)用getInstance(),可能會導(dǎo)致并發(fā)問題怠惶,所以要在getInstance()前加上synchronized進(jìn)行同步酬凳,但是這樣每次都要判斷取募,會降低訪問速度.可以用雙重檢查鎖.
雙重檢查鎖的第一次檢查是檢查實例是否存在壮吩,如果不存在再進(jìn)入下面的同步塊不皆,而不是直接進(jìn)入同步塊.第二重檢查是進(jìn)入同步塊后贯城,再檢查實例是否存在,如果不存在霹娄,就在同步的情況下創(chuàng)景實例.

/**
*雙重檢查鎖的單例模式
*/

public class Singleton{
  /**
    * 對保存實例的變量添加volitile的修飾
    * 唯一實例
  */
  private volatile static Singleton instance = null;

  //只能由類自己負(fù)責(zé)創(chuàng)建實例
  private Singleton(){

  }

  //外部訪問實例的方法
  public static getInstance(){
    //第一重檢查能犯,檢查實例是否存在,如果不存在犬耻,再進(jìn)入同步代碼塊
    if (interface  == null)
        //鎖定代碼塊
        synchronized (Singleton.class){
          //第二重檢查
          if (instance == null) {
                instance = new Singleton();//創(chuàng)建單例實例
          }
        }
    }
    return instance;
  }    
}

更好的實現(xiàn)方式

餓漢單例模式在類加載的時候就會創(chuàng)建悲雳,不能實現(xiàn)延時加載,如果以后不用香追,還會占據(jù)內(nèi)存合瓢,還會影響程序的加載效率.懶漢單例模式需確保線程安全,性能會受到影響.比較好的實現(xiàn)方式是結(jié)合二者的優(yōu)點透典,使用靜態(tài)內(nèi)部類來實現(xiàn)單例模式.

public class Singleton {

    /**
     * 類級的內(nèi)部類晴楔,也就是靜態(tài)類的成員式內(nèi)部類,
    *該內(nèi)部類的實例與外部類的實例沒有綁定關(guān)系峭咒,而且只有被調(diào)用時才會裝載税弃,從而實現(xiàn)了延遲加載
     */
     private static class SingletonHolder{
        /**
         * 靜態(tài)初始化器,由JVM來保證線程安全
         */
        private static Singleton instance = new Singleton();
    }

    /**
     * 私有化構(gòu)造方法
     * 只能由類自己負(fù)責(zé)創(chuàng)建實例
     */
    private Singleton(){

    }

    public static Singleton getInstance(){
        return SingletonHolder.instance;
    }
}

使用靜態(tài)內(nèi)部類凑队,能實現(xiàn)延時加載则果,保證線程安全,又不影響系統(tǒng)性能.

枚舉類型實現(xiàn)

根據(jù)<Effective Java>第二版漩氨,單元素的枚舉類型已經(jīng)成為實現(xiàn)Singleton的最佳方法西壮。

/**
 * 使用枚舉來實現(xiàn)單例模式
 *
 */
public class Singleton {

    /**
     * 定義一個枚舉的元素,它就代表了Singleton的一個實例
     */
    uniqueInstance;

    /**
     * 單例的方法
     */
    public void singletonOperation(){
        //功能樹立
    }
}

單例的使用場景

系統(tǒng)只需要要一個實例對象叫惊,而且客戶調(diào)用類的單個實例只允許使用一個公共訪問點款青,除了該公共訪問點,不能通過其他途徑訪問該實例霍狰。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末抡草,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蔗坯,更是在濱河造成了極大的恐慌康震,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宾濒,死亡現(xiàn)場離奇詭異腿短,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進(jìn)店門答姥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铣除,“玉大人,你說我怎么就攤上這事鹦付∩姓常” “怎么了?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵敲长,是天一觀的道長郎嫁。 經(jīng)常有香客問我,道長祈噪,這世上最難降的妖魔是什么泽铛? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮辑鲤,結(jié)果婚禮上盔腔,老公的妹妹穿的比我還像新娘。我一直安慰自己月褥,他們只是感情好弛随,可當(dāng)我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著宁赤,像睡著了一般舀透。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上决左,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天愕够,我揣著相機與錄音,去河邊找鬼佛猛。 笑死惑芭,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的挚躯。 我是一名探鬼主播强衡,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼擦秽,長吁一口氣:“原來是場噩夢啊……” “哼码荔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起感挥,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤缩搅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后触幼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體硼瓣,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了堂鲤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亿傅。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖瘟栖,靈堂內(nèi)的尸體忽然破棺而出葵擎,到底是詐尸還是另有隱情,我是刑警寧澤半哟,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布酬滤,位于F島的核電站,受9級特大地震影響寓涨,放射性物質(zhì)發(fā)生泄漏盯串。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一戒良、第九天 我趴在偏房一處隱蔽的房頂上張望体捏。 院中可真熱鬧,春花似錦糯崎、人聲如沸译打。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奏司。三九已至,卻和暖如春樟插,著一層夾襖步出監(jiān)牢的瞬間韵洋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工黄锤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留搪缨,地道東北人。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓鸵熟,卻偏偏與公主長得像副编,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子流强,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,652評論 2 354

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