006-單例模式(更好的實(shí)現(xiàn)方式:內(nèi)部類和枚舉)

內(nèi)部類和單例

懶漢式和餓漢式都存在小小的缺陷,有沒(méi)有一種更好的方案,既能實(shí)現(xiàn)延遲加載,又能實(shí)現(xiàn)線程安全呢?解決方案是Lazy initialization holder calss模式,這個(gè)模式綜合了Java 的類級(jí)內(nèi)部類和多線程默認(rèn)同步鎖的知識(shí),很巧妙的同時(shí)實(shí)現(xiàn)了延遲加載和線程安全。


演示代碼如下:


當(dāng)getInstance第一次被調(diào)用時(shí),才第一次讀取ClassSingletonHolder.instance,導(dǎo)致ClassSingletonHolder得到初始化,而這個(gè)類初始化時(shí),會(huì)初始化靜態(tài)域instance,從而創(chuàng)建ClassSingleton對(duì)象,由于是靜態(tài)域,因此只會(huì)被虛擬機(jī)在裝載類的時(shí)候初始化一次,并由虛擬機(jī)保證它的線程安全。





單例和枚舉

單元素的枚舉類是實(shí)現(xiàn)單例的最佳方式。

Java的枚舉類本身也是功能齊全的類,有自己的屬性和方法,因此也可以作為一般的類使用。枚舉類的基本思想是通過(guò)共有的靜態(tài)final域?yàn)槊總€(gè)枚舉常量導(dǎo)出實(shí)例的類。


使用枚舉來(lái)實(shí)現(xiàn)單例非常簡(jiǎn)單,只需要編寫一個(gè)包含單個(gè)元素的枚舉類即可,演示代碼如下:

可以看到上面極其簡(jiǎn)單的代碼在枚舉中實(shí)現(xiàn)了單例,獲取實(shí)例的話,可以直接使用類名加屬性。

枚舉實(shí)現(xiàn)單例不僅更加簡(jiǎn)潔,而且無(wú)償提供序列化的機(jī)制,并有jvm從根本上提供保障,絕對(duì)防止多次實(shí)例化,是更簡(jiǎn)潔高效安全的實(shí)現(xiàn)單例的方式。





代碼:https://gitee.com/blueses/design-pattern

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 30,262評(píng)論 8 265
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,618評(píng)論 19 139
  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂(lè)視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,818評(píng)論 11 349
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,674評(píng)論 1 32
  • 步驟: 1,點(diǎn)擊"貓堡服務(wù)"。 2,點(diǎn)擊"我要上課",再點(diǎn)擊"貓堡大課堂"。 3,點(diǎn)擊"查看更多我參與的"。 4,...
    清涼_蟲(chóng)子閱讀 968評(píng)論 0 1

友情鏈接更多精彩內(nèi)容