請實(shí)現(xiàn)單例模式

要點(diǎn)

  1. 某個類只能有一個實(shí)例
    • 構(gòu)造器私有化
  2. 它必須自行創(chuàng)建這個實(shí)例
    • 含有一個該類的靜態(tài)變量來保存這個唯一實(shí)例
  3. 必須自行先整個系統(tǒng)提供這個實(shí)例
    • 對外提供獲取該實(shí)例對象的方式
      1. 直接暴露
      2. 用靜態(tài)變量的 get 方法獲取

常見幾種形式

  • 餓漢式:直接創(chuàng)建對象不存在線程安全問題
    • 直接實(shí)例化餓漢式(簡潔直觀)
    • 枚舉式(最簡潔)
    • 靜態(tài)代碼塊餓漢式(適合復(fù)雜實(shí)例化)
  • 懶漢式:延遲創(chuàng)建對象
    • 線程不安全(適用于單線程)
    • 線程安全(適用于多線程)
    • 靜態(tài)內(nèi)部列形式(適用于多線程)
  1. 直接實(shí)例化對象借卧,不管是否需要這個對象-餓漢式
/*
* 餓漢式
*(1)構(gòu)造器私有化
*(2)自行創(chuàng)建,并用靜態(tài)變量保存
*(3)向外提供這個實(shí)例
*(4)強(qiáng)調(diào)這是單例颜曾,用final修飾(這個變量只能賦值一次锋拖,之后不能修改)
*/
public class Singleton1 {
    public static final Singleton1 INSTANCE = new Singleton1();
    private Singleton1 (){
        
    }
}
  1. 枚舉-jdk1.5之后-餓漢式
/*
*餓漢式
*枚舉類型:表示該類型的對象是有限的幾個
*我們可以限定為一個佛嬉,就成了單例
*/
public enum Singleton2{
    INSTANCE
}
  1. 靜態(tài)代碼塊-餓漢式
/*
* 這種方式,適合那種需要從配置文件里面讀一堆信息來實(shí)例化迷守。
*/
public class Singleton3 {
    public static final Singleton3 INSTANCE;
    private String info;
    static {
        try {
            Properties pro = new Properties(); // 從位于src目錄下的配置文件single.properties中讀取信息
            pro.load(Sinfleton3.class.getClassLoader().getResourceAsStream("single.properties"));
            INSTANCE = new Singleton3(pro.getPropertied("info"));
        }catch(IOExcepption e){
            throw new RuntimeException(e);
        }
    }
    private Singleton3 (String info){
        this.info = info;
    }
}

4.線程不安全(適合單線程)-懶漢式

/*
* 懶漢式
*(1)構(gòu)造器私有化
*(2)靜態(tài)變量保存
*(3)提供一個靜態(tài)方法,獲取實(shí)例對象
*/
public class Singleton4 {
    private static Singleton4 instance;
    private Singleton4 (){
        
    }
    public static Singleton4 getInstance(){
        if(instance == null){
            //加上Thread.sleep(100);多線程情況下 會實(shí)例化兩個對象旺入。
            instance = new Singleton4();
        }
        return instance;
    }
}
  1. 線程安全(適合多線程)-懶漢式
/*
* 懶漢式
*(1)構(gòu)造器私有化
*(2)靜態(tài)變量保存
*(3)提供一個靜態(tài)方法盒犹,獲取實(shí)例對象
*/
public class Singleton5 {
    private static Singleton5 instance;
    private Singleton5 (){
        
    }
    public static Singleton5 getInstance(){
        if(instance == null){//先判斷是否為空,再進(jìn)行加鎖。
            synchronized(Singleton5.class){
                //加上Thread.sleep(100);多線程情況下 會實(shí)例化兩個對象急膀。
                instance = new Singleton5();
            }
        }
        return instance;
    }
}
  1. 靜態(tài)內(nèi)部類形式
/*
* 再內(nèi)部類被加載和初始化時沮协,才創(chuàng)建INSTANCE實(shí)例對象
* 靜態(tài)內(nèi)部類不會自動隨著外部類的加載和初始化而初始化,它是要單獨(dú)去加載和初始化的
* 因?yàn)槭窃趦?nèi)部類加載和初始化是,創(chuàng)建的卓嫂,因此是線程安全的慷暂。
*/
public class Singleton6 {
    
    private Singleton6 (){
        
    }
    private static class Inner{
        private static final Singleton6 INSTANCE = new Singleton6();
    }
    public static Singleton6 getInstance(){
        return Inner.INSTANCE;
    }
}
?著作權(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

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