摘要:第二種懶漢式線程不安全對(duì)象為空才去實(shí)例化懶漢式是在使用的時(shí)候才會(huì)去加載,不過(guò)當(dāng)多次同時(shí)去加載的時(shí)候就會(huì)存在線程安全問(wèn)題。
單例模式,是一種常用的軟件設(shè)計(jì)模式,在它的核心結(jié)構(gòu)中只包含一個(gè)被稱為單例的特殊類,通過(guò)單例模式可以保證系統(tǒng)中一個(gè)類只有一個(gè)實(shí)例。即一個(gè)類只有一個(gè)對(duì)象實(shí)例。
第一種:餓漢式
public class SingleEasy { private SingleEasy(){ } //類初始化的時(shí)候就已經(jīng)加載 private static SingleEasy singleEasy=new SingleEasy(); public static SingleEasy getInstance(){ return singleEasy; } }
餓漢式的話不存在多線程同步加載的問(wèn)題,類初始化時(shí)就已經(jīng)加載,做不到使用的時(shí)候才加載。
第二種:懶漢式(線程不安全)
public class SingleNotEmptyEasy { private static SingleNotEmptyEasy singleNotEmptyEasy; private SingleNotEmptyEasy(){ } public static SingleNotEmptyEasy getInstance(){ //對(duì)象為空才去實(shí)例化 if(singleNotEmptyEasy==null){ singleNotEmptyEasy=new SingleNotEmptyEasy(); } return singleNotEmptyEasy; } }
懶漢式是在使用的時(shí)候才會(huì)去加載,不過(guò)當(dāng)多次同時(shí)去加載的時(shí)候就會(huì)存在線程安全問(wèn)題。
第三種:懶漢式(線程安全)
public class SingleNotEmptyEasy { private static SingleNotEmptyEasy singleNotEmptyEasy; private SingleNotEmptyEasy(){ } public static synchronized SingleNotEmptyEasy getInstance(){ //對(duì)象對(duì)空才去實(shí)例化 if(singleNotEmptyEasy==null){ singleNotEmptyEasy=new SingleNotEmptyEasy(); } return singleNotEmptyEasy; } }
就是在第二種的getInstance方法上面加了一個(gè)同步鎖synchronized,每次在使用加載的時(shí)候都會(huì)先去校驗(yàn),如果已經(jīng)有在加載了,就不會(huì)去加載,而是要等前面的加載完了,才會(huì)去加載,這樣線程安全,但是每次都去校驗(yàn)synchronized會(huì)造成效率的下降。
第四種:DCL
public class DCLSingle { private volatile static DCLSingle dclSingle; private DCLSingle(){ } public static DCLSingle getInstance(){ if(dclSingle==null){ synchronized (DCLSingle.class){ if(dclSingle==null){ dclSingle=new DCLSingle(); } } } return dclSingle; } }
DCL模式的不同是沒(méi)有將同步鎖加載方法上,而是加在代碼塊里面,如果單例對(duì)象不為空就直接返回,如果為空就會(huì)走到加了同步鎖的代碼塊中,還會(huì)進(jìn)行第二次校驗(yàn),這樣子提高了效率,同時(shí)也保證了線程的安全,這種模式還涉及到一個(gè)java的關(guān)鍵字volatile,加了volatile,可以保證無(wú)論何時(shí)讀取這個(gè)變量,都是讀到內(nèi)存中最新的值,無(wú)論何時(shí)寫(xiě)這個(gè)變量,都可以立即寫(xiě)到內(nèi)存中。
第五種:內(nèi)部類模式
public class InnnerClassSingle { private InnnerClassSingle(){ } private static class SingleHolder{ private static InnnerClassSingle innnerClassSingle=new InnnerClassSingle(); } public static InnnerClassSingle getInstance(){ return SingleHolder.innnerClassSingle; } }
內(nèi)部類模式是一種比較優(yōu)雅的餓漢式,它是在InnnerClassSingle內(nèi)中再建一個(gè)SingleHolder內(nèi)部類,在內(nèi)部類中創(chuàng)建一個(gè)InnnerClassSingle對(duì)象,通過(guò)內(nèi)部類調(diào)用加載實(shí)例化,這樣子不會(huì)隨著類的加載的而實(shí)例化,做到了使用的時(shí)候才實(shí)例化。
第六種:枚舉模式
public enum EnumManager { SDCardManager(10){ @Override public EnumManager getSingle() { return SDCardManager; } } , HttpManager(1){ @Override public EnumManager getSingle() { return HttpManager; } }; public abstract EnumManager getSingle(); private EnumManager(int type){ } }
這里需要注意的是枚舉的構(gòu)造方法是私有的,變量的聲明要在構(gòu)造方法之前。
歡迎加入學(xué)習(xí)交流群569772982,大家一起學(xué)習(xí)交流。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/70505.html
摘要:總結(jié)單例是運(yùn)用頻率很高的模式,因?yàn)榭蛻舳藳](méi)有高并發(fā)的情況,選擇哪種方式并不會(huì)有太大的影響,出于效率考慮,推薦使用和靜態(tài)內(nèi)部類實(shí)現(xiàn)單例模式。 單例模式介紹 單例模式是應(yīng)用最廣的模式之一,也可能是很多人唯一會(huì)使用的設(shè)計(jì)模式。在應(yīng)用單例模式時(shí),單例對(duì)象的類必須保證只用一個(gè)實(shí)例存在。許多時(shí)候整個(gè)系統(tǒng)只需要一個(gè)全局對(duì)象,這樣有利于我么能協(xié)調(diào)整個(gè)系統(tǒng)整體的行為。 單例模式的使用場(chǎng)景 確保某個(gè)類有且...
摘要:不符合設(shè)計(jì)模式中的單一職責(zé)的概念。引入代理實(shí)現(xiàn)單例模式引入代理實(shí)現(xiàn)單例模式的特點(diǎn)我們負(fù)責(zé)管理單例的邏輯移到了代理類中。的單例模式對(duì)比在以上的代碼中實(shí)現(xiàn)的單例模式都混入了傳統(tǒng)面向?qū)ο笳Z(yǔ)言的特點(diǎn)。 聲明:這個(gè)系列為閱讀《JavaScript設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐》 ----曾探@著一書(shū)的讀書(shū)筆記 1.單例模式的特點(diǎn)和定義 保證一個(gè)類僅有一個(gè)實(shí)例,并且提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)。 2.傳統(tǒng)面向?qū)?..
摘要:如果需要防范這種攻擊,請(qǐng)修改構(gòu)造函數(shù),使其在被要求創(chuàng)建第二個(gè)實(shí)例時(shí)拋出異常。單例模式與單一職責(zé)原則有沖突。源碼地址參考文獻(xiàn)設(shè)計(jì)模式之禪 定義 單例模式是一個(gè)比較簡(jiǎn)單的模式,其定義如下: 保證一個(gè)類僅有一個(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ū)中,將單例模式稱作單件模式。通過(guò)關(guān)鍵字,來(lái)保證不會(huì)同時(shí)有兩個(gè)線程進(jìn)入該方法的實(shí)例對(duì)象改善多線程問(wèn)題為了符合大多數(shù)程序,很明顯地,我們需要確保單例模式能在多線程的情況下正常工作。 在《Head First 設(shè)計(jì)模式》一書(shū)中,將單例模式稱作單件模式。這里為了適應(yīng)大環(huán)境,把它稱之為大家更熟悉的單例模式。 一、了解單例模式 1.1 什么是單例模式 單例模式確保一個(gè)類只有一個(gè)實(shí)例,...
閱讀 2515·2021-11-25 09:43
閱讀 1274·2021-09-07 10:16
閱讀 2697·2021-08-20 09:38
閱讀 3001·2019-08-30 15:55
閱讀 1555·2019-08-30 13:21
閱讀 972·2019-08-29 15:37
閱讀 1503·2019-08-27 10:56
閱讀 2141·2019-08-26 13:45