单例模式的五种写法
1、懶漢式,線程不安全
顧名思義就是實(shí)例在用到的時(shí)候才去創(chuàng)建,“比較懶”,用的時(shí)候才去檢查有沒(méi)有實(shí)例,如果有則返回,沒(méi)有則新建
2、懶漢式,線程安全
public class Singleton { private static Singleton instance; private Singleton (){} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }3、餓漢式
餓漢式,從名字上也很好理解,就是“比較勤”,實(shí)例在初始化的時(shí)候就已經(jīng)建好了,不管你有沒(méi)有用到,都先建好了再說(shuō)。好處是沒(méi)有線程安全的問(wèn)題,壞處是浪費(fèi)內(nèi)存空間
4、雙檢鎖/雙重校驗(yàn)鎖(DCL,即 double-checked locking)
雙檢鎖,又叫雙重校驗(yàn)鎖,綜合了懶漢式和餓漢式兩者的優(yōu)缺點(diǎn)整合而成??瓷厦娲a實(shí)現(xiàn)中,特點(diǎn)是在synchronized關(guān)鍵字內(nèi)外都加了一層 if 條件判斷,這樣既保證了線程安全,又比直接上鎖提高了執(zhí)行效率,還節(jié)省了內(nèi)存空間
5、登記式/靜態(tài)內(nèi)部類(lèi)
靜態(tài)內(nèi)部類(lèi)的方式效果類(lèi)似雙檢鎖,但實(shí)現(xiàn)更簡(jiǎn)單。但這種方式只適用于靜態(tài)域的情況,雙檢鎖方式可在實(shí)例域需要延遲初始化時(shí)使用
6、枚舉
枚舉的方式是比較少見(jiàn)的一種實(shí)現(xiàn)方式,但是看上面的代碼實(shí)現(xiàn),卻更簡(jiǎn)潔清晰。并且她還自動(dòng)支持序列化機(jī)制,絕對(duì)防止多次實(shí)例化
好了,上面就是單例模式的五種主要寫(xiě)法。我們來(lái)總結(jié)下,一般情況下,懶漢式(包含線程安全和線程不安全梁總方式)都比較少用;餓漢式和雙檢鎖都可以使用,可根據(jù)具體情況自主選擇;在要明確實(shí)現(xiàn) lazy loading 效果時(shí),可以考慮靜態(tài)內(nèi)部類(lèi)的實(shí)現(xiàn)方式;若涉及到反序列化創(chuàng)建對(duì)象時(shí),大家也可以嘗試使用枚舉方式
總結(jié)
- 上一篇: 什么是javadoc文档
- 下一篇: idea 设置识别ini文件