1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        5分鐘搞定Java單例模式!

        共 1615字,需瀏覽 4分鐘

         ·

        2021-05-12 08:54



        單例模式

        單例模式(Singleton),也叫單子模式,是一種常用的軟件設(shè)計(jì)模式。在應(yīng)用這個(gè)模式時(shí),單例對(duì)象的類(lèi)必須保證只有一個(gè)實(shí)例存在。許多時(shí)候整個(gè)系統(tǒng)只需要擁有一個(gè)的全局對(duì)象,這樣有利于我們協(xié)調(diào)系統(tǒng)整體的行為。

        比如在某個(gè)服務(wù)器程序中,該服務(wù)器的配置信息存放在一個(gè)文件中,這些配置數(shù)據(jù)由一個(gè)單例對(duì)象統(tǒng)一讀取,然后服務(wù)進(jìn)程中的其他對(duì)象再通過(guò)這個(gè)單例對(duì)象獲取這些配置信息。這種方式簡(jiǎn)化了在復(fù)雜環(huán)境下的配置管理。


        單例模式的運(yùn)用場(chǎng)景


        • 外部資源:每臺(tái)計(jì)算機(jī)有若干個(gè)打印機(jī),但只能有一個(gè)PrinterSpooler,以避免兩個(gè)打印作業(yè)同時(shí)輸出到打印機(jī)。


        • Windows的Task Manager(任務(wù)管理器)就是很典型的單例模式(這個(gè)很熟悉吧),想想看,是不是呢,你能打開(kāi)兩個(gè)windows task manager嗎?


        • 多線程的線程池的設(shè)計(jì)一般也是采用單例模式,這是由于線程池要方便對(duì)池中的線程進(jìn)行控制。


        實(shí)現(xiàn)單例模式的方法思路


        一個(gè)類(lèi)能返回對(duì)象一個(gè)引用(永遠(yuǎn)是同一個(gè))和一個(gè)獲得該實(shí)例的方法(必須是靜態(tài)方法,通常使用getInstance這個(gè)名稱(chēng));


        當(dāng)我們調(diào)用這個(gè)方法時(shí),如果類(lèi)持有的引用不為空就返回這個(gè)引用,如果類(lèi)保持的引用為空就創(chuàng)建該類(lèi)的實(shí)例并將實(shí)例的引用賦予該類(lèi)保持的引用。


        同時(shí)我們 還將該類(lèi)的構(gòu)造函數(shù)定義為私有方法,這樣其他處的代碼就無(wú)法通過(guò)調(diào)用該類(lèi)的構(gòu)造函數(shù)來(lái)實(shí)例化該類(lèi)的對(duì)象,只有通過(guò)該類(lèi)提供的靜態(tài)方法來(lái)得到該類(lèi)的唯一實(shí)例。


        實(shí)現(xiàn)單例模式的方式


        01

        懶漢單例式

        • 天生線程不安全:這種方式是最基本的實(shí)現(xiàn)方式,這種實(shí)現(xiàn)最大的問(wèn)題就是不支持多線程。因?yàn)闆](méi)有加鎖 synchronized,所以嚴(yán)格意義上它并不算單例模式。



        • 天生線程不安全:這種方式具備很好的 lazy loading,能夠在多線程中很好的工作,但是,效率很低,99% 情況下不需要同步。



        02

        餓漢單列式


        這種方式比較常用,但容易產(chǎn)生垃圾對(duì)象。



        03

        靜態(tài)內(nèi)部類(lèi)的方式


        這種方式能達(dá)到雙檢鎖方式一樣的功效,但實(shí)現(xiàn)更簡(jiǎn)單。對(duì)靜態(tài)域使用延遲初始化,應(yīng)使用這種方式而不是雙檢鎖方式。這種方式只適用于靜態(tài)域的情況,雙檢鎖方式可在實(shí)例域需要延遲初始化時(shí)使用。



        04

        枚舉


        這種實(shí)現(xiàn)方式還沒(méi)有被廣泛采用,但這是實(shí)現(xiàn)單例模式的最佳方法。它更簡(jiǎn)潔,自動(dòng)支持序列化機(jī)制,絕對(duì)防止多次實(shí)例化。



        資源加載和性能區(qū)別


        餓漢式在類(lèi)創(chuàng)建的同時(shí)就實(shí)例化一個(gè)靜態(tài)對(duì)象出來(lái),不管之后會(huì)不會(huì)使用這個(gè)單例,都會(huì)占據(jù)一定的內(nèi)存,但是相應(yīng)的,在第一次調(diào)用時(shí)速度也會(huì)更快,因?yàn)槠滟Y源已經(jīng)初始化完成。


        而懶漢式,會(huì)延遲加載,在第一次使用該單例的時(shí)候才會(huì)實(shí)例化對(duì)象出來(lái),第一次調(diào)用時(shí)要做初始化,如果要做的工作比較多,性能上會(huì)有些延遲,之后就和餓漢式一樣了。


        靜態(tài)內(nèi)部類(lèi)的方式資源利用率高,但第一次加載時(shí)反應(yīng)不夠快;java中餓單例模式性能優(yōu)于懶單例模式,若對(duì)資源十分在意可以采用靜態(tài)內(nèi)部類(lèi)。

        如果你還未走入編程的世界,不妨先來(lái)了解一下編程的世界,再去選擇學(xué)習(xí)哪一個(gè)吧!


        對(duì)于想學(xué)互聯(lián)網(wǎng)技術(shù)卻又不敢貿(mào)然行動(dòng)的同學(xué),點(diǎn)擊下方“閱讀原文即可報(bào)名達(dá)內(nèi)免費(fèi)試聽(tīng)課,這是你免費(fèi)了解、學(xué)習(xí)的技術(shù)最佳途徑,體驗(yàn)名師面對(duì)面教導(dǎo),多年實(shí)戰(zhàn)經(jīng)驗(yàn)傾囊相授,少走彎路,零基礎(chǔ)快速入門(mén)到精通!


        學(xué)互聯(lián)網(wǎng)技術(shù)不能猶豫,否則你就和高薪擦肩而過(guò)了。不論你是0基礎(chǔ)還是轉(zhuǎn)行,都有大牛老師手把手教你學(xué)習(xí)最新熱門(mén)技術(shù),找一份自己滿意的高薪工作。

        課程咨詢(xún)后臺(tái)回復(fù):客服,真人在線答疑方便又快捷。達(dá)妹微信:tedu521,獲取學(xué)習(xí)資源。


        IT方向技術(shù)內(nèi)容免費(fèi)學(xué)

        Java/Java架構(gòu)師/Java大數(shù)據(jù)

        掃碼即可免費(fèi)預(yù)約

        ↓↓↓


        點(diǎn)擊下方“閱讀原文”搶免費(fèi)試聽(tīng)名額吧!

        瀏覽 118
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            亚洲视频免费视频在线视频免费视频 | 国产第七页 | 欧美日韩小穴 | 嗯啊慢点视频 | 夜夜高潮夜夜爽精品欧美做爱 | 99reav | 探花色 | 免费亚洲电影 | 大相蕉伊人网 | 看一级操逼片 |