java設(shè)計(jì)模式01(單例模式)

單例模式是結(jié)構(gòu)最簡單的設(shè)計(jì)模式隘世,核心結(jié)構(gòu)只包含一個(gè)特殊類即單例類。通過單例模式可以確保系統(tǒng)中的一個(gè)類只有一個(gè)實(shí)例而且該實(shí)例易于外界訪問丘逸,從而方便對實(shí)例個(gè)數(shù)進(jìn)行控制浦徊,節(jié)約系統(tǒng)資源馏予。

單例模式的目的是保證系統(tǒng)中一個(gè)類有且只有一個(gè)實(shí)例,并提供一個(gè)訪問它的全局訪問點(diǎn)盔性。

常見單例模式實(shí)現(xiàn):

1.餓漢式單例模式(在類加載時(shí)就已創(chuàng)建單例對象)
在類被加載時(shí)霞丧,靜態(tài)變量instance會(huì)被初始化,此時(shí)類的私有構(gòu)造函數(shù)會(huì)被調(diào)用纯出,創(chuàng)建單例類的唯一實(shí)例蚯妇。
餓漢式在類加載時(shí)就已實(shí)例化,無須考慮多線程訪問暂筝,但不能實(shí)現(xiàn)延遲加載箩言,不管用不用都會(huì)占用內(nèi)存。

public class EagerSingleton {

  private static final EagerSingleton instance = new EagerSingleton();

  private EagerSingleton() {

  }

  public static EagerSingleton getInstance() {
      return instance;
  }
}

2.雙重檢查加鎖的懶漢式單例(延遲加載焕襟,在調(diào)用時(shí)才會(huì)去實(shí)例化)
懶漢式單例類在第一次使用時(shí)創(chuàng)建陨收,無須一直占用系統(tǒng)資源,實(shí)現(xiàn)了延遲加載鸵赖,但出現(xiàn)多線程同時(shí)首次引用的幾率變得比較大务漩,需要通過雙重檢查加鎖等機(jī)制來控制,將導(dǎo)致系統(tǒng)性能受到一定影響它褪。
使用雙重檢查加鎖的懶漢式單例模式饵骨,需要在靜態(tài)成員變量instance之前增加修飾符volatile,被volatile修飾的成員變量可以確保多個(gè)線程都能正確處理茫打,但volatile關(guān)鍵字會(huì)屏蔽Java 虛擬機(jī)所做的一些代碼優(yōu)化居触。

public class LazySingleton {

    private volatile static LazySingleton instance = null;

    private LazySingleton() {

    }

    public static LazySingleton getInstance() {
        // 第一重檢查
        if (instance == null) {
            // 加鎖
            synchronized (LazySingleton.class) {
                // 第二重檢查
                if (instance == null) {
                    instance = new LazySingleton();
                }
            }
        }
        return instance;
    }
}

3.靜態(tài)內(nèi)部類單例模式(實(shí)現(xiàn)延遲加載,又可以保證線程安全老赤,不影響系統(tǒng)性能)
由于靜態(tài)單例對象沒有作為Singleton的成員變量直接實(shí)例化轮洋,因此類加載時(shí)不會(huì)實(shí)例化Singleton,第一次調(diào)用getInstance()時(shí)將加載內(nèi)部類HolderClass,在該內(nèi)部類中定義了一個(gè)static類型的變量instance, 此時(shí)會(huì)首先初始化這個(gè)成員變量抬旺,由java虛擬機(jī)來保證其線程安全性弊予,確保該成員變量只能初始化一次。 由于getInstance()方法沒有任何線程鎖定开财,因此其性能不會(huì)造成任何影響汉柒。

public class Singleton {
    
    private Singleton() {
        
    }

    //靜態(tài)內(nèi)部類
    public static class HolderClass{
        private final static Singleton instance=new Singleton();
    }
    
    public static Singleton getInstance(){
        return HolderClass.instance;
    }
}

4.test

/**
 * Created by ZhangCheng on ${currentDate:date('yyyy/MM/dd')}
 */
public class Test {
    
    public static void main(String[] args) {
        Singleton s1=Singleton.getInstance();
        Singleton s2=Singleton.getInstance();
        //引用數(shù)據(jù)類型:當(dāng)他們用(==)進(jìn)行比較的時(shí)候,比較的是他們在內(nèi)存中的存放地址(確切的說责鳍,是堆內(nèi)存地址)
        if(s1==s2) {
            System.out.println("實(shí)例為同一實(shí)例竭翠!");
        }
    }

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市薇搁,隨后出現(xiàn)的幾起案子斋扰,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,294評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件传货,死亡現(xiàn)場離奇詭異屎鳍,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)问裕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,493評論 3 385
  • 文/潘曉璐 我一進(jìn)店門逮壁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人粮宛,你說我怎么就攤上這事窥淆。” “怎么了巍杈?”我有些...
    開封第一講書人閱讀 157,790評論 0 348
  • 文/不壞的土叔 我叫張陵忧饭,是天一觀的道長。 經(jīng)常有香客問我筷畦,道長词裤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,595評論 1 284
  • 正文 為了忘掉前任鳖宾,我火速辦了婚禮吼砂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鼎文。我一直安慰自己渔肩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,718評論 6 386
  • 文/花漫 我一把揭開白布拇惋。 她就那樣靜靜地躺著周偎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蚤假。 梳的紋絲不亂的頭發(fā)上栏饮,一...
    開封第一講書人閱讀 49,906評論 1 290
  • 那天吧兔,我揣著相機(jī)與錄音磷仰,去河邊找鬼。 笑死境蔼,一個(gè)胖子當(dāng)著我的面吹牛灶平,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播箍土,決...
    沈念sama閱讀 39,053評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼逢享,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了吴藻?” 一聲冷哼從身側(cè)響起瞒爬,我...
    開封第一講書人閱讀 37,797評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后侧但,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體矢空,經(jīng)...
    沈念sama閱讀 44,250評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,570評論 2 327
  • 正文 我和宋清朗相戀三年禀横,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了屁药。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,711評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡柏锄,死狀恐怖酿箭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情趾娃,我是刑警寧澤缭嫡,帶...
    沈念sama閱讀 34,388評論 4 332
  • 正文 年R本政府宣布,位于F島的核電站茫舶,受9級特大地震影響械巡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜饶氏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,018評論 3 316
  • 文/蒙蒙 一讥耗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧疹启,春花似錦古程、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,796評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至荤懂,卻和暖如春茁裙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背节仿。 一陣腳步聲響...
    開封第一講書人閱讀 32,023評論 1 266
  • 我被黑心中介騙來泰國打工晤锥, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人廊宪。 一個(gè)月前我還...
    沈念sama閱讀 46,461評論 2 360
  • 正文 我出身青樓矾瘾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親箭启。 傳聞我的和親對象是個(gè)殘疾皇子壕翩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,595評論 2 350

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