java 中單例模式餓漢式與懶漢式的對比
java 中單例模式餓漢式與懶漢式的對比
概念:
保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。
以前我們的做法是設(shè)置一個全局變量,也就是讓它使得一個對象被訪問。但是它不能防止你實例多個對象。這時我們可以讓類自身負(fù)責(zé)保存它的唯一實例,這個類可以保證沒有其他實例可以被創(chuàng)建,并且提供一個訪問該實例的方法。
通過上面的描述,我們可以看到單例模式有以下特點:
1、單例類只能有一個實例。
2、單例類必須自己自己創(chuàng)建自己的唯一實例。
3、單例類必須給所有其他對象提供這一實例。
因此,創(chuàng)建一個類的實例的具體方法(要素)是:
1、 私有的、靜態(tài)的成員變量
2、 私有的構(gòu)造方法
3、 公共的、靜態(tài)的一個入口方法
根據(jù)上面的具體方法,我們來看一下下面的代碼
public class Test { private static Test instance = new Test (); private Test (){ } public static Test GetInstance(){ return instance; } }
從上面的代碼中我們看出,當(dāng)類加載到內(nèi)存時,在我們調(diào)用GetInstance()方法之前,就已經(jīng)在內(nèi)存中創(chuàng)建了一個instance對象。也就是說,不管我是否想用這個方法,在內(nèi)存中就已經(jīng)存在instance這個對象了,此時這個對象就是多余對象了,這樣就會占用內(nèi)存資源。因此我們將這種單例模式稱作“餓漢式”單例模式。其實就是一個“預(yù)加載”的過程。
而“懶漢式”單例模式(也就是“延遲式”創(chuàng)建對象)則是在我們需要的時候才去創(chuàng)建這個對象。這樣就避免了提前創(chuàng)建對象占用內(nèi)存資源。
public class Test { private static Test instance = null; private Test (){ } public static Test getInstance(){ if (instance == null) then { instance = new Test (); } return instance; } }
但是,通過觀察上面的代碼,我們可以看出其中還是存在一些問題的。假設(shè),有多個進程同時調(diào)用getInstance()方法,這樣就可能出現(xiàn)同時創(chuàng)建多個對象,那這就不是單例模式了。因此,我們可以加入“同步”這個關(guān)鍵字使得我們的代碼更加的嚴(yán)謹(jǐn)。改進之后是這樣的
public class Test { private static Test instance = null; private Test (){ } public static synchronized Test getInstance(){ if (instance == null) then { instance = new Test (); } return instance; } }
以上就是java中兩種單例模式的對比,如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
基于spring?data?jpa?@query返回map的踩坑記錄
這篇文章主要介紹了基于spring?data?jpa?@query返回map的踩坑記錄,具有很好的參考價值,如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11java中常見XML解析器的使用詳解(JAXP,DOM4J,Jsoup,JsoupXPath)
為了處理和操作XML數(shù)據(jù),我們需要使用XML解析器,本文將介紹幾種常用的XML解析器,包括JAXP、DOM4J、Jsoup和JsoupXPath,需要的小伙伴可以參考一下2023-11-11Java基礎(chǔ)之spring5新功能學(xué)習(xí)
這篇文章主要介紹了Java基礎(chǔ)之spring5新功能學(xué)習(xí),文中有非常詳細的代碼示例,對正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有很好的幫助,需要的朋友可以參考下2021-05-05Java web.xml之contextConfigLocation作用案例詳解
這篇文章主要介紹了Java web.xml之contextConfigLocation作用案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-08-08