摘要:懶漢式單例模式單例類(lèi)測(cè)試類(lèi)輸出實(shí)現(xiàn)方式構(gòu)造方法私有化。存在問(wèn)題線程不安全,如果多個(gè)線程同時(shí)訪問(wèn),仍會(huì)產(chǎn)生多個(gè)實(shí)例對(duì)象。
一般實(shí)現(xiàn)
創(chuàng)建執(zhí)行方法
public class WithoutSingleton { public static void withoutSingletonInfo(WithoutSingleton withoutSingleton){ System.out.println("WithoutSingleton.hashCode = " + withoutSingleton.hashCode()); } }
測(cè)試類(lèi)
public static void main(String[] args) { WithoutSingleton withoutSingleton = new WithoutSingleton(); WithoutSingleton.withoutSingletonInfo(withoutSingleton); WithoutSingleton withoutSingleton2 = new WithoutSingleton(); WithoutSingleton.withoutSingletonInfo(withoutSingleton2); WithoutSingleton withoutSingleton3 = new WithoutSingleton(); WithoutSingleton.withoutSingletonInfo(withoutSingleton3); }
輸出
WithoutSingleton.hashCode = 2083479002 WithoutSingleton.hashCode = 163238632 WithoutSingleton.hashCode = 1215070805
問(wèn)題
每次生成的類(lèi)的實(shí)例對(duì)象都是不同的,但是在一些特定的場(chǎng)合,需要每次返回的實(shí)例對(duì)象都是同一個(gè),如:sping中創(chuàng)建bean。
懶漢式單例模式
單例類(lèi)
public class LazySingleton { private static LazySingleton lazySingleton = null; private LazySingleton(){ } public static LazySingleton getInstance(){ if(lazySingleton == null){ lazySingleton = new LazySingleton(); } return lazySingleton; } public static void singletonInfo(){ System.out.println("lazySingleton.hashCode = " + lazySingleton.hashCode()); } }
測(cè)試類(lèi):
public static void main(String[] args) { LazySingleton lazySingleton = LazySingleton.getInstance(); lazySingleton.singletonInfo(); LazySingleton lazySingleton2 = LazySingleton.getInstance(); lazySingleton2.singletonInfo(); LazySingleton lazySingleton3 = LazySingleton.getInstance(); lazySingleton3.singletonInfo(); }
輸出:
lazySingleton.hashCode = 1110594262 lazySingleton.hashCode = 1110594262 lazySingleton.hashCode = 1110594262
實(shí)現(xiàn)方式
構(gòu)造方法私有化。
存在問(wèn)題
線程不安全,如果多個(gè)線程同時(shí)訪問(wèn),仍會(huì)產(chǎn)生多個(gè)實(shí)例對(duì)象。
解決方法
1.在getInstance()方法上同步synchronized(同步對(duì)性能有影響)
2.雙重檢查鎖定
3.靜態(tài)內(nèi)部類(lèi)
餓漢式單例模式
代碼實(shí)現(xiàn)
public class HungrySingleton { private static HungrySingleton hungrySingleton = new HungrySingleton(); private HungrySingleton(){ } public static HungrySingleton getInstance(){ return hungrySingleton; } public static void singletonInfo(){ System.out.println("hungrySingleton.hashCode = " + hungrySingleton.hashCode()); } }
輸出
hungrySingleton.hashCode = 1977385357 hungrySingleton.hashCode = 1977385357 hungrySingleton.hashCode = 1977385357
說(shuō)明
靜態(tài)成員變量在類(lèi)加載的時(shí)候就會(huì)創(chuàng)建實(shí)例對(duì)象,解決了線程不安全問(wèn)題
缺點(diǎn)
類(lèi)加載時(shí)就創(chuàng)建實(shí)例對(duì)象,會(huì)占用系統(tǒng)內(nèi)存,如果存在大量單例類(lèi)(一般不會(huì)出現(xiàn)),或者創(chuàng)建的類(lèi)并沒(méi)有使用,會(huì)造成內(nèi)存浪費(fèi)。
源碼
https://github.com/Seasons20/DisignPattern.git
END
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/69245.html
摘要:如果需要防范這種攻擊,請(qǐng)修改構(gòu)造函數(shù),使其在被要求創(chuàng)建第二個(gè)實(shí)例時(shí)拋出異常。單例模式與單一職責(zé)原則有沖突。源碼地址參考文獻(xiàn)設(shè)計(jì)模式之禪 定義 單例模式是一個(gè)比較簡(jiǎn)單的模式,其定義如下: 保證一個(gè)類(lèi)僅有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)。 或者 Ensure a class has only one instance, and provide a global point of ac...
摘要:在設(shè)計(jì)模式一書(shū)中,將單例模式稱(chēng)作單件模式。通過(guò)關(guān)鍵字,來(lái)保證不會(huì)同時(shí)有兩個(gè)線程進(jìn)入該方法的實(shí)例對(duì)象改善多線程問(wèn)題為了符合大多數(shù)程序,很明顯地,我們需要確保單例模式能在多線程的情況下正常工作。 在《Head First 設(shè)計(jì)模式》一書(shū)中,將單例模式稱(chēng)作單件模式。這里為了適應(yīng)大環(huán)境,把它稱(chēng)之為大家更熟悉的單例模式。 一、了解單例模式 1.1 什么是單例模式 單例模式確保一個(gè)類(lèi)只有一個(gè)實(shí)例,...
摘要:總結(jié)單例是運(yùn)用頻率很高的模式,因?yàn)榭蛻舳藳](méi)有高并發(fā)的情況,選擇哪種方式并不會(huì)有太大的影響,出于效率考慮,推薦使用和靜態(tài)內(nèi)部類(lèi)實(shí)現(xiàn)單例模式。 單例模式介紹 單例模式是應(yīng)用最廣的模式之一,也可能是很多人唯一會(huì)使用的設(shè)計(jì)模式。在應(yīng)用單例模式時(shí),單例對(duì)象的類(lèi)必須保證只用一個(gè)實(shí)例存在。許多時(shí)候整個(gè)系統(tǒng)只需要一個(gè)全局對(duì)象,這樣有利于我么能協(xié)調(diào)整個(gè)系統(tǒng)整體的行為。 單例模式的使用場(chǎng)景 確保某個(gè)類(lèi)有且...
摘要:雙重檢查鎖單例模式懶漢單例模式中,我們并不需要整個(gè)方法都是同步的,我們只需要確保再創(chuàng)建的時(shí)候,進(jìn)行同步即可。單例模式的缺點(diǎn)優(yōu)點(diǎn)在開(kāi)頭已經(jīng)說(shuō)明了,單例模式的缺點(diǎn)在于它一般沒(méi)有接口,擴(kuò)展困難,基本上修改源代碼是擴(kuò)展單例模式的唯一方法。 單例模式 定義: 確保某一個(gè)類(lèi)只有一個(gè)實(shí)例對(duì)象,并且該對(duì)象是自行實(shí)例化的,通過(guò)統(tǒng)一的接口向整個(gè)系統(tǒng)提供這個(gè)實(shí)例對(duì)象。 使用場(chǎng)景: 避免產(chǎn)生多個(gè)對(duì)象消耗過(guò)多的...
閱讀 1220·2023-04-25 20:31
閱讀 3730·2021-10-14 09:42
閱讀 1502·2021-09-22 16:06
閱讀 2684·2021-09-10 10:50
閱讀 3536·2021-09-07 10:19
閱讀 1782·2019-08-30 15:53
閱讀 1180·2019-08-29 15:13
閱讀 2826·2019-08-29 13:20