單例模式

單例模式介紹

單例模式是java創(chuàng)建性模式的一種,提供了一種創(chuàng)建對象的最佳模式.

關(guān)于指令集亂序:

在堆中的對象,還沒有完全實例完成,就將地址交給了引用

設(shè)計意圖:

保證一個類只有一個實例,減小內(nèi)存開支,減少資源多次鏈接(當(dāng)一個類是作為資源鏈接,保證這個實例為唯一實例,而不是鏈接一次,新建一個實例,這樣能有效減少系統(tǒng)開銷).

設(shè)計思想:

1.單例類只能有一個實例.

2.單例必須自己創(chuàng)建自己的唯一實例,且構(gòu)造函數(shù)私有(反射除外).

3.單例必須給所有其他對象,提供這一個實例.

設(shè)計舉例:

  • android 中SharepreferenceUtils初始化.需要在application中初始化單例.

  • 連接數(shù)據(jù)庫mysql的實例,需要一個jdbc實例.

設(shè)計方式:

1.餓漢式,線程安全


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

2.懶漢式,線程不安全


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

3.懶漢式,線程安全


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

4.雙重校驗鎖(DCL拿霉,即 double-checked locking) 線程安全

這種方式采用雙鎖機(jī)制腋寨,安全且在多線程情況下能保持高性能硅瞧。
getInstance() 的性能對應(yīng)用程序很關(guān)鍵。

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

}

5.靜態(tài)內(nèi)部類


public class InnnerClassSingleton {
    
    private InnnerClassSingleton() {
        
    };
    
    /**
     * 靜態(tài)內(nèi)部類,其實和一個靜態(tài)外部類的內(nèi)存加載方式一樣.
     * 只有在將內(nèi)部類被調(diào)用時,才會將SingleHolder.class文件,加載到方法區(qū).
     * 然后將所有靜態(tài)變量(區(qū),方法)進(jìn)行初始化,達(dá)到加載完成.(懶加載效果)
     * 這種方法,保證了唯一實例
     * @author ccj
     *
     */
    private static class SingleHolder{
        private final static InnnerClassSingleton INSTANCE =new InnnerClassSingleton();
        
    }
    
    public InnnerClassSingleton getInstance(){
        
        return SingleHolder.INSTANCE;
    }
}

6.枚舉法

       1. 枚舉中的屬性必須放在最前面太惠,一般使用大寫字母表示

    2. 枚舉中可以和java類一樣定義方法

    3. 枚舉中的構(gòu)造方法必須是私有的

默認(rèn)枚舉實例的創(chuàng)建是線程安全的.(創(chuàng)建枚舉類的單例在JVM層面也是能保證線程安全的), 所以不需要擔(dān)心線程安全的問題


public enum EnumSingleton {
    
    INSTANCE;
    
    public void write(){
        
    }
    

}

總結(jié)

1.惡漢模式,當(dāng)classloader加載完成.class文件后,就實例化對象,線程安全,但是沒有懶加載.在沒有明確要求懶加載時候,推薦使用.

2.懶漢模式,當(dāng)調(diào)用時才會實例化對象,但是線程不安全.即使用sychronize同步,也會出現(xiàn)指令集亂序,造成多個實例產(chǎn)生.

3.DCL雙重檢驗鎖模式,用voliate和sychronize保證只有一個實例.但是大量的校驗對比,會使效率低.

4.內(nèi)部類模式,優(yōu)雅的模式,懶加載,而且線程安全,所以推薦使用.

5.枚舉方式,最佳的單例方式,它更簡潔,自動支持序列化機(jī)制值朋,絕對防止多次實例化沮稚。推薦使用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末洛波,一起剝皮案震驚了整個濱河市胰舆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蹬挤,老刑警劉巖缚窿,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異焰扳,居然都是意外死亡倦零,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門吨悍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扫茅,“玉大人,你說我怎么就攤上這事育瓜『叮” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵躏仇,是天一觀的道長恋脚。 經(jīng)常有香客問我,道長钙态,這世上最難降的妖魔是什么慧起? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮册倒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘磺送。我一直安慰自己驻子,他們只是感情好灿意,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著崇呵,像睡著了一般缤剧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上域慷,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天荒辕,我揣著相機(jī)與錄音,去河邊找鬼犹褒。 笑死抵窒,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的叠骑。 我是一名探鬼主播李皇,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼宙枷!你這毒婦竟也來了掉房?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤慰丛,失蹤者是張志新(化名)和其女友劉穎卓囚,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诅病,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡捍岳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了睬隶。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锣夹。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖苏潜,靈堂內(nèi)的尸體忽然破棺而出银萍,到底是詐尸還是另有隱情,我是刑警寧澤恤左,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布贴唇,位于F島的核電站,受9級特大地震影響飞袋,放射性物質(zhì)發(fā)生泄漏戳气。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一巧鸭、第九天 我趴在偏房一處隱蔽的房頂上張望瓶您。 院中可真熱鬧,春花似錦、人聲如沸呀袱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽夜赵。三九已至明棍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間寇僧,已是汗流浹背摊腋。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留嘁傀,地道東北人兴蒸。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像心包,于是被迫代替她去往敵國和親类咧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

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