java單例五種實(shí)現(xiàn)模式解析
餓漢式(線程安全,調(diào)用效率高,但是不能延時(shí)加載)
一上來(lái)就把單例對(duì)象創(chuàng)建出來(lái)了,要用的時(shí)候直接返回即可,這種可以說(shuō)是單例模式中最簡(jiǎn)單的一種實(shí)現(xiàn)方式。但是問(wèn)題也比較明顯。單例在還沒(méi)有使用到的時(shí)候,初始化就已經(jīng)完成了。也就是說(shuō),如果程序從頭到位都沒(méi)用使用這個(gè)單例的話,單例的對(duì)象還是會(huì)創(chuàng)建。這就造成了不必要的資源浪費(fèi)。所以不推薦這種實(shí)現(xiàn)方式。
public class ImageLoader{ private static ImageLoader instance = new ImageLoader; private ImageLoader(){} public static ImageLoader getInstance(){ return instance; } }
懶漢式(線程安全,調(diào)用效率不高,但是能延時(shí)加載)
public class SingletonDemo2 { //類初始化時(shí),不初始化這個(gè)對(duì)象(延時(shí)加載,真正用的時(shí)候再創(chuàng)建) private static SingletonDemo2 instance; //構(gòu)造器私有化 private SingletonDemo2(){} //方法同步,調(diào)用效率低 public static synchronized SingletonDemo2 getInstance(){ if(instance==null){ instance=new SingletonDemo2(); } return instance; } }
靜態(tài)內(nèi)部類實(shí)現(xiàn)模式(線程安全,調(diào)用效率高,可以延時(shí)加載)
可以看到使用這種方式我們沒(méi)有顯式的進(jìn)行任何同步操作,那他是如何保證線程安全呢?和餓漢模式一樣,是靠JVM保證類的靜態(tài)成員只能被加載一次的特點(diǎn),這樣就從JVM層面保證了只會(huì)有一個(gè)實(shí)例對(duì)象。
那么問(wèn)題來(lái)了,這種方式和餓漢模式又有什么區(qū)別呢?不也是立即加載么?實(shí)則不然,加載一個(gè)類時(shí),其內(nèi)部類不會(huì)同時(shí)被加載。一個(gè)類被加載,當(dāng)且僅當(dāng)其某個(gè)靜態(tài)成員(靜態(tài)域、構(gòu)造器、靜態(tài)方法等)被調(diào)用時(shí)發(fā)生。
但是在遇到序列化對(duì)象時(shí),默認(rèn)的方式運(yùn)行得到的結(jié)果就是多例的。這種情況不多做說(shuō)明了,使用時(shí)請(qǐng)注意。
public class SingletonDemo3 { private static class SingletonClassInstance{ private static final SingletonDemo3 instance=new SingletonDemo3(); } private SingletonDemo3(){} public static SingletonDemo3 getInstance(){ return SingletonClassInstance.instance; } }
枚舉類(線程安全,調(diào)用效率高,不能延時(shí)加載,可以天然的防止反射和反序列化調(diào)用)
public enum SingletonDemo4 { //枚舉元素本身就是單例 INSTANCE; //添加自己需要的操作 public void singletonOperation(){ } }
Double CheckLock實(shí)現(xiàn)單例:DCL也就是雙重鎖判斷機(jī)制(由于JVM底層模型原因,偶爾會(huì)出問(wèn)題,不建議使用)
選用
單例對(duì)象 占用資源少,不需要延時(shí)加載,枚舉 好于 餓漢
單例對(duì)象 占用資源多,需要延時(shí)加載,靜態(tài)內(nèi)部類 好于 懶漢式
注意線程安全問(wèn)題
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
java實(shí)現(xiàn)簡(jiǎn)易連連看小游戲
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)易連連看小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05Java語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單FTP軟件 FTP軟件效果圖預(yù)覽之上傳功能(3)
這篇文章主要為大家詳細(xì)介紹了Java語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單FTP軟件,F(xiàn)TP軟件效果圖預(yù)覽之上傳功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03Java躲不過(guò)設(shè)計(jì)模式的坑之代理模式詳解
設(shè)計(jì)模式看來(lái)更像是一種設(shè)計(jì)思維或設(shè)計(jì)思想,為你的項(xiàng)目工程提供方向,讓你的項(xiàng)目工程更加健壯、靈活,延續(xù)生命力。本文即將分享的是設(shè)計(jì)模式的其中一種:代理模式,感興趣的可以了解一下2022-09-09詳解idea maven nexus 常見(jiàn)命令配置
這篇文章主要介紹了idea maven nexus 常見(jiàn)命令配置的相關(guān)知識(shí),通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04如何解決java:錯(cuò)誤:無(wú)效的源發(fā)行版:16
這篇文章主要介紹了如何解決java:錯(cuò)誤: 無(wú)效的源發(fā)行版:16問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04Java SpringBoot使用guava過(guò)濾器
這篇文章主要介紹了Java SpringBoot使用guava過(guò)濾器,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容戒殺,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09Jmeter結(jié)構(gòu)體系及運(yùn)行原理順序解析
這篇文章主要介紹了Jmeter結(jié)構(gòu)體系及運(yùn)行原理順序解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09