概述
有時候有這樣一個需求:一個類對外只提供一個實例,并且只能有一個實例.
這時候就需要引入單例模式這種設(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ī)制。