概述
有時(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):涉及多線程問題,需要考慮線程安全問題
餓漢式
餓漢式天生就是線程安全的,直接用于多線程不會(huì)出現(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ī)制。