概述

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

分類

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

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

餓漢式

餓漢式天生就是線程安全的,直接用于多線程不會出現(xiàn)問題。
實現(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是實現(xiàn)懶漢式線程安全的3中方式。

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

實現(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)下,這個懶漢式的單例可以正常工作,但在多線程環(huán)境下,仍然能產(chǎn)生多個實例。這就不符合最初的要求了,可以考慮加入鎖的機(jī)制。

網(wǎng)友評論