二、五種單例模式

解法一:只適合單線程環(huán)境(不好)

/** 
* @author xiaoping
 * */
public class Singleton { 
private static Singleton instance=null; 
private Singleton(){
    } 
public static Singleton getInstance(){ if(instance==null){
            instance=new Singleton();
        } return instance;
    }
}

注解:Singleton的靜態(tài)屬性instance中撬讽,只有instance為null的時候才創(chuàng)建一個實(shí)例,構(gòu)造函數(shù)私有悬垃,確保每次都只創(chuàng)建一個游昼,避免重復(fù)創(chuàng)建。
缺點(diǎn):只在單線程的情況下正常運(yùn)行盗忱,在多線程的情況下酱床,就會出問題。例如:當(dāng)兩個線程同時運(yùn)行到判斷instance是否為空的if語句趟佃,并且instance確實(shí)沒有創(chuàng)建好時扇谣,那么兩個線程都會創(chuàng)建一個實(shí)例。

解法二:多線程的情況可以用闲昭。(懶漢式罐寨,不好)

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

注解:在解法一的基礎(chǔ)上加上了同步鎖,使得在多線程的情況下可以用序矩。例如:當(dāng)兩個線程同時想創(chuàng)建實(shí)例鸯绿,由于在一個時刻只有一個線程能得到同步鎖,當(dāng)?shù)谝粋€線程加上鎖以后簸淀,第二個線程只能等待瓶蝴。第一個線程發(fā)現(xiàn)實(shí)例沒有創(chuàng)建,創(chuàng)建之租幕。第一個線程釋放同步鎖舷手,第二個線程才可以加上同步鎖,執(zhí)行下面的代碼劲绪。由于第一個線程已經(jīng)創(chuàng)建了實(shí)例男窟,所以第二個線程不需要創(chuàng)建實(shí)例盆赤。保證在多線程的環(huán)境下也只有一個實(shí)例。
缺點(diǎn):每次通過getInstance方法得到singleton實(shí)例的時候都有一個試圖去獲取同步鎖的過程歉眷。而眾所周知牺六,加鎖是很耗時的。能避免則避免汗捡。

解法三:加同步鎖時淑际,前后兩次判斷實(shí)例是否存在(可行)

public class Singleton { 
private static Singleton instance=null; 
private Singleton(){

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

注解:只有當(dāng)instance為null時,需要獲取同步鎖凉唐,創(chuàng)建一次實(shí)例庸追。當(dāng)實(shí)例被創(chuàng)建,則無需試圖加鎖台囱。
缺點(diǎn):用雙重if判斷淡溯,復(fù)雜,容易出錯簿训。

解法四:餓漢式(建議使用)

public class Singleton { 
      private static Singleton instance=new Singleton(); 
      private Singleton(){

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

注解:初試化靜態(tài)的instance創(chuàng)建一次咱娶。如果我們在Singleton類里面寫一個靜態(tài)的方法不需要創(chuàng)建實(shí)例,它仍然會早早的創(chuàng)建一次實(shí)例强品。而降低內(nèi)存的使用率膘侮。

缺點(diǎn):沒有l(wèi)azy loading的效果,從而降低內(nèi)存的使用率的榛。

解法五:靜態(tài)內(nèi)部內(nèi)琼了。(建議使用)

public class Singleton { 
    private Singleton(){

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

注解:定義一個私有的內(nèi)部類,在第一次用這個嵌套類時夫晌,會創(chuàng)建一個實(shí)例雕薪。而類型為SingletonHolder的類,只有在Singleton.getInstance()中調(diào)用晓淀,由于私有的屬性所袁,他人無法使用SingleHolder,不調(diào)用Singleton.getInstance()就不會創(chuàng)建實(shí)例凶掰。
優(yōu)點(diǎn):達(dá)到了lazy loading的效果燥爷,即按需創(chuàng)建實(shí)例。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末懦窘,一起剝皮案震驚了整個濱河市前翎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌畅涂,老刑警劉巖鱼填,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異毅戈,居然都是意外死亡苹丸,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門苇经,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赘理,“玉大人,你說我怎么就攤上這事扇单∩棠#” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵蜘澜,是天一觀的道長施流。 經(jīng)常有香客問我,道長鄙信,這世上最難降的妖魔是什么瞪醋? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮装诡,結(jié)果婚禮上银受,老公的妹妹穿的比我還像新娘。我一直安慰自己鸦采,他們只是感情好宾巍,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著渔伯,像睡著了一般顶霞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上锣吼,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天选浑,我揣著相機(jī)與錄音,去河邊找鬼吐限。 笑死鲜侥,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的诸典。 我是一名探鬼主播描函,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼狐粱!你這毒婦竟也來了舀寓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤肌蜻,失蹤者是張志新(化名)和其女友劉穎互墓,沒想到半個月后真椿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體愕撰,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡躬充,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年坷澡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片育谬。...
    茶點(diǎn)故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡券盅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出膛檀,到底是詐尸還是另有隱情锰镀,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布咖刃,位于F島的核電站泳炉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏嚎杨。R本人自食惡果不足惜花鹅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望磕潮。 院中可真熱鬧翠胰,春花似錦、人聲如沸自脯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽膏潮。三九已至锻狗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間焕参,已是汗流浹背轻纪。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留叠纷,地道東北人刻帚。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像涩嚣,于是被迫代替她去往敵國和親崇众。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評論 2 355