1.創(chuàng)建型設(shè)計(jì)模式--單例設(shè)計(jì)模式

單例設(shè)計(jì)模式(Singleton Pattern)

是Java最簡單的設(shè)計(jì)模式味混,相信很多人都應(yīng)用過蔓挖,但是你的真的完全了解單例設(shè)計(jì)模式嗎?

1.餓漢式--最簡單的單例設(shè)計(jì)模式(比較常用)

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

優(yōu)點(diǎn):

  • 1.寫法簡單

  • 2.線程安全

缺點(diǎn):

  • 1.不能傳遞參數(shù)拷获。
  • 2.類加載的時(shí)候就初始化了對象未蝌,浪費(fèi)內(nèi)存左冬。

2.懶漢式

這個(gè)單例設(shè)計(jì)模式梅忌,相對來說稍微復(fù)雜一些(比較常用)

public class DataManager {

    //懶漢式
    private static DataManager instance;
    private DataManager(){}
    public static DataManager getInstance(){
        if (null == instance){
            instance = new DataManager();
        }
        return instance;
    }
}

這個(gè)方式略顯復(fù)雜,如果是沒有多線程的情況下蹋笼,使用很方便效率也比較高圾笨,并且還可以傳遞參數(shù)。但是悲敷,線程不安全后德,多線程的時(shí)候可能產(chǎn)生多個(gè)對象的情況。那么如何解決這個(gè)問題,請看下面這個(gè)方式

3.懶漢式+線程安全

為了解決懶漢式非線程安全的問題落蝙,加個(gè)鎖來解決這個(gè)問題。

public class DataManager {

    //懶漢式+線程安全
    private static DataManager instance;
    private DataManager(){}
    public static synchronized DataManager getInstance(){
        if (null == instance){
            instance = new DataManager();
        }
        return instance;
    }
}

相對于純餓漢式只是增加了一個(gè)synchronized 關(guān)鍵字,這樣在多線程的情況下能夠很好的工作病瞳,但是存在一個(gè)明顯的問題就是效率低亲善,%99的情況下是不需要同步的。那么能否既可以線程安全又效率比較高渣蜗,請看下面這個(gè)實(shí)現(xiàn)方式

4.雙重校驗(yàn)鎖實(shí)現(xiàn)方式

為了解決單純添加同步關(guān)鍵字帶來的問題,使用double check 這個(gè)實(shí)現(xiàn)方式

public class DataManager {

    //雙重校驗(yàn)鎖
    private volatile static DataManager instance;
    private DataManager(){}
    public static  DataManager getInstance(){
        if (null == instance){
            synchronized(DataManager.class){
                if (null !=null){
                    instance = new DataManager();
                }
            }
        }
        return instance;
    }
}

這個(gè)實(shí)現(xiàn)方式闰围,比較復(fù)雜一些碧查,但是能很好的保證在多線程下良好的運(yùn)行肤视,并且效率也比較高腐螟。

注意volatile這個(gè)關(guān)鍵字的使用

  • 保證了不同線程對這個(gè)變量操作的可見性摇予,即某個(gè)線程修改了這個(gè)變量在其他線程會立即可見
  • 禁止指令重排

如果不添加這個(gè)關(guān)鍵字宁昭,在多cpu的情況下可能出現(xiàn)線程不同步的問題出現(xiàn)疆拘。

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

public class DataManager {

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

這種方式寫法簡單漱挚,也是線程安全(是由類加載機(jī)制保證的)

6.枚舉的方式

public enum DataManager {

    INSTANCE;

    public void doSomething(){
        System.out.println("do something");
    }
}

這個(gè)方式實(shí)現(xiàn)是最簡單的租漂,效率也是最高的秃踩,推薦使用這個(gè)方式。

以上就是常見的單例的設(shè)計(jì)模式的實(shí)現(xiàn)方式蒜胖,根據(jù)項(xiàng)目需求選擇合適的方式進(jìn)行使用即可。

單例設(shè)計(jì)模式的擴(kuò)展,多例設(shè)計(jì)

public class DataManager {

    //單例設(shè)計(jì)模式的擴(kuò)展
    private static final int MAX = 3;
    private static Map<Integer,DataManager> mDataManager=new HashMap<>();
    private static int index=1;
    private volatile static DataManager instance;
    private DataManager(){}
    public static  DataManager getInstance(){
        instance = mDataManager.get(index);
        if (null == instance){
            synchronized(DataManager.class){
                if (null ==null){
                    instance = new DataManager();
                    mDataManager.put(index,instance);
                }
            }
        }
        index++;
        if (index>MAX){
            index=1;
        }
        return instance;
    }
}

上面這個(gè)實(shí)現(xiàn)方式也就是多例模式蒂胞,通過參數(shù)MAX就可以控制創(chuàng)建實(shí)例的個(gè)數(shù)了岳瞭,一些數(shù)據(jù)庫連接池牡昆、網(wǎng)絡(luò)的連接池就是這個(gè)方式實(shí)現(xiàn)的。

針對單例設(shè)計(jì)模式就寫到這里了,本人水平有限如果存在不足之處,歡迎指正與交流。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末驯击,一起剝皮案震驚了整個(gè)濱河市苹熏,隨后出現(xiàn)的幾起案子轨域,更是在濱河造成了極大的恐慌枉长,老刑警劉巖钻蹬,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡塘淑,警方通過查閱死者的電腦和手機(jī)曙蒸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進(jìn)店門臂港,熙熙樓的掌柜王于貴愁眉苦臉地迎上來式散,“玉大人响驴,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵憎亚,是天一觀的道長。 經(jīng)常有香客問我别威,道長仔拟,這世上最難降的妖魔是什么科侈? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任权薯,我火速辦了婚禮黍析,結(jié)果婚禮上蔼两,老公的妹妹穿的比我還像新娘俊戳。我一直安慰自己腔稀,他們只是感情好瘟芝,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著褥琐,像睡著了一般锌俱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上敌呈,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天贸宏,我揣著相機(jī)與錄音,去河邊找鬼磕洪。 笑死吭练,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的析显。 我是一名探鬼主播鲫咽,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼叫榕!你這毒婦竟也來了浑侥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤晰绎,失蹤者是張志新(化名)和其女友劉穎寓落,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體荞下,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡伶选,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了尖昏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仰税。...
    茶點(diǎn)故事閱讀 39,731評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖抽诉,靈堂內(nèi)的尸體忽然破棺而出陨簇,到底是詐尸還是另有隱情,我是刑警寧澤迹淌,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布河绽,位于F島的核電站,受9級特大地震影響唉窃,放射性物質(zhì)發(fā)生泄漏耙饰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一纹份、第九天 我趴在偏房一處隱蔽的房頂上張望苟跪。 院中可真熱鬧廷痘,春花似錦、人聲如沸件已。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拨齐。三九已至鳞陨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瞻惋,已是汗流浹背厦滤。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留歼狼,地道東北人掏导。 一個(gè)月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像羽峰,于是被迫代替她去往敵國和親趟咆。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評論 2 354

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