JAVA設(shè)計(jì)模式之老生常談的單例模式

** 類型:**它是一種創(chuàng)建類模式性置。
在平時(shí)開發(fā)的時(shí)候,無論是自己寫還是看別人的代碼揍堰,可能隨時(shí)都會(huì)看到單例模式鹏浅。可能有的人都寫得不愛了屏歹。但是我還是想根據(jù)我的見解來說說它隐砸。
單例模式就是確保一個(gè)類只有一個(gè)實(shí)例,并提供一個(gè)訪問它的全局訪問點(diǎn)。單例模式寫法有好幾種蝙眶。

  • 餓漢式:private static Singleton uniqueInstance = new Singleton();
  • 懶漢式: private static Singleton uniqueInstance = null;

Java里面實(shí)現(xiàn)的單例是一個(gè)虛擬機(jī)的范圍季希。因?yàn)檠b載類的功能是虛擬機(jī)的,所以一個(gè)虛擬機(jī)在通過自己的ClassLoader裝載餓漢式實(shí)現(xiàn)單例類的時(shí)候就會(huì)創(chuàng)建一個(gè)類的實(shí)例幽纷。
懶漢式單例有延遲加載和緩存的思想式塌。

懶漢式單例

//懶漢式單例類.在第一次調(diào)用的時(shí)候?qū)嵗约?  
public class Singleton {  
    private Singleton() {}  
    private static Singleton single=null;  
    //靜態(tài)工廠方法   
    public static Singleton getInstance() {  
         if (single == null) {    
             single = new Singleton();  
         }    
        return single;  
    }  
}  

餓漢式單例

//餓漢式單例類.在類初始化時(shí),已經(jīng)自行實(shí)例化   
public class Singleton1 {  
    private Singleton1() {}  
    private static final Singleton1 single = new Singleton1();  
    //靜態(tài)工廠方法   
    public static Singleton1 getInstance() {  
        return single;  
    }  
}  

餓漢式與懶漢式的區(qū)別

  • 懶漢式是典型的時(shí)間換空間友浸,餓漢式是典型的空間換時(shí)間
  • 不加同步的懶漢式是線程不安全的峰尝。比如,有兩個(gè)線程收恢,一個(gè)是線程A境析,一個(gè)是線程B,它們同時(shí)調(diào)用getInstance方法派诬,就可能導(dǎo)致并發(fā)問題劳淆。餓漢式是線程安全的,因?yàn)樘摂M機(jī)保證只會(huì)裝載一次默赂,在裝載類的時(shí)候是不會(huì)發(fā)生并發(fā)的沛鸵。

如何保證懶漢式的同步問題

  • 1.同步方法
public static synchronized Singleton getInstance() {  
         if (single == null) {    
             single = new Singleton();  
         }    
        return single;  
} 

但這樣會(huì)降低整個(gè)訪問的速度,而且每次都要判斷缆八∏可以用雙重檢查加鎖。

  • 2.雙重檢查加鎖
    雙重加鎖機(jī)制奈辰,指的是:并不是每次進(jìn)入getInstance方法都需要同步栏妖,而是先不同步,進(jìn)入方法過后奖恰,先檢查實(shí)例是否存在吊趾,如果不存在才進(jìn)入下面的同步塊宛裕,這是第一重檢查。進(jìn)入同步塊后论泛,再次檢查實(shí)例是否存在揩尸,如果不存在,就在同步的情況下創(chuàng)建一個(gè)實(shí)例屁奏。這是第二重檢查岩榆。
    雙重加鎖機(jī)制的實(shí)現(xiàn)會(huì)使用一個(gè)關(guān)鍵字volatile,它的意思是:被volatile修飾的變量的值坟瓢,將不會(huì)被本地線程緩存勇边,所有對(duì)該變量的讀寫都是直接操作共享內(nèi)存,從而確保多個(gè)線程能正確的處理該變量折联。
public class Singleton {

    /**
     * 對(duì)保存實(shí)例的變量添加volitile的修飾
     */
    private volatile static Singleton instance = null;
    private Singleton(){

    }
    public static Singleton getInstance(){
        if(instance == null){
            synchronized (Singleton.class) {
                instance = new Singleton();
            }
        }
        return instance;
    }
}

單元素的枚舉類型實(shí)現(xiàn)單例

根據(jù)《Effective Java第二版》中的說法粒褒,單元素的枚舉類型已經(jīng)成為實(shí)現(xiàn)Singleton的最佳方法。

public enum Singleton  {   
 singleton; 
   private Singleton () {    }
}

如有不妥崭庸,歡迎指出怀浆。哈哈哈哈

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末谊囚,一起剝皮案震驚了整個(gè)濱河市怕享,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌镰踏,老刑警劉巖函筋,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異奠伪,居然都是意外死亡跌帐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門绊率,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谨敛,“玉大人,你說我怎么就攤上這事滤否×忱辏” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵藐俺,是天一觀的道長(zhǎng)炊甲。 經(jīng)常有香客問我,道長(zhǎng)欲芹,這世上最難降的妖魔是什么卿啡? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮菱父,結(jié)果婚禮上颈娜,老公的妹妹穿的比我還像新娘剑逃。我一直安慰自己,他們只是感情好揭鳞,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布炕贵。 她就那樣靜靜地躺著,像睡著了一般野崇。 火紅的嫁衣襯著肌膚如雪称开。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天乓梨,我揣著相機(jī)與錄音鳖轰,去河邊找鬼。 笑死扶镀,一個(gè)胖子當(dāng)著我的面吹牛蕴侣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播臭觉,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼昆雀,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了蝠筑?” 一聲冷哼從身側(cè)響起狞膘,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎什乙,沒想到半個(gè)月后挽封,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡臣镣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年辅愿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片忆某。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡点待,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出弃舒,到底是詐尸還是另有隱情癞埠,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布棒坏,位于F島的核電站燕差,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏坝冕。R本人自食惡果不足惜徒探,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望喂窟。 院中可真熱鬧测暗,春花似錦央串、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至稚字,卻和暖如春饲宿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背胆描。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工瘫想, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人昌讲。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓国夜,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親短绸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子车吹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

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