概述

有時(shí)候有這樣一個(gè)需求:一個(gè)類對外只提供一個(gè)實(shí)例,并且只能有一個(gè)實(shí)例.
這時(shí)候就需要引入單例模式這種設(shè)計(jì)模式

分類

  • 餓漢式
    類加載完成時(shí)就完成了對類實(shí)例的實(shí)例化。
    優(yōu)點(diǎn):不涉及多線程問題,不需要考慮線程安全問題。
    缺點(diǎn):類一加載就實(shí)例化,提前占用系統(tǒng)資源

  • 懶漢式
    類加載完成時(shí)不進(jìn)行類實(shí)例的實(shí)例化,而是在類的實(shí)例使用的時(shí)候才進(jìn)行實(shí)例化。
    優(yōu)點(diǎn):類一加載不對實(shí)例進(jìn)行實(shí)例化,而是在使用時(shí)進(jìn)行實(shí)例化。
    缺點(diǎn):涉及多線程問題,需要考慮線程安全問題

餓漢式

餓漢式天生就是線程安全的,直接用于多線程不會出現(xiàn)問題。
實(shí)現(xiàn)代碼:

public class Single {        private static final Single single = new Single();        private Single(){} // 構(gòu)造方法私有化
        public static Single getInstance() {            return single;
        }
}

懶漢式

懶漢式本身就是非線程安全的,下面的例1展示了非線程安全的懶漢式,例2,3,4是實(shí)現(xiàn)懶漢式線程安全的3中方式。

1. 懶漢式(一定存在線程安全問題)

實(shí)現(xiàn)代碼:

public class Single {    private static Single single;    private Single(){} // 構(gòu)造方法私有化
    public static Single getInstance() {        if (single == null) {
            single = new Single();
        }        return single;
    }
}

注意: 在單線程狀態(tài)下,這個(gè)懶漢式的單例可以正常工作,但在多線程環(huán)境下,仍然能產(chǎn)生多個(gè)實(shí)例。這就不符合最初的要求了,可以考慮加入鎖的機(jī)制。

延伸閱讀

學(xué)習(xí)是年輕人改變自己的最好方式-Java培訓(xùn),做最負(fù)責(zé)任的教育,學(xué)習(xí)改變命運(yùn),軟件學(xué)習(xí),再就業(yè),大學(xué)生如何就業(yè),幫大學(xué)生找到好工作,lphotoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)學(xué)習(xí)是年輕人改變自己的最好方式