相關歷史文章(閱讀本文前,您可能需要先看下之前的系列👇)
國內最全的Spring Boot系列之三
2020上半年發文匯總「值得收藏」
SpringBoot框架開發的優秀的項目「值得收藏學習」 - 第335
1天學會別人1個月學會的設計模式
大話設計模式之愛你一萬年:第一章 設計模式基本概念:
大話設計模式之愛你一萬年:第一章 設計模式基本概念:2.GoF的23種設計模式的分類和功能
大話設計模式之愛你一萬年:第一章 設計模式基本概念:3.設計模式的六大原則
大話設計模式之愛你一萬年:第二章 創建型模式:單例模式::我的女朋友只有你一個:1.單例模式的基本概念
大話設計模式之愛你一萬年:第二章 創建型模式:單例模式::我的女朋友只有你一個:2.單例模式的實現-懶漢模式
3. 單例模式的實現-餓漢模式
學習了懶漢模式的實現單例方式,那麼餓漢模式So easy了。
一、單例模式-餓漢模式
1.1 定義
類加載的初始化階段就完成了類的實例化。
(1)類的初始化:是完成程序執行前的準備工作。在這個階段,靜態的(變量,方法,代碼塊)會被執行。同時在會開闢一塊存儲空間用來存放靜態的數據。初始化只在類加載的時候執行一次。
(2)類的實例化:是指創建一個對象的過程。這個過程中會在堆中開闢內存,將一些非靜態的方法,變量存放在裡面。在程序執行的過程中,可以創建多個對象,既多次實例化。每次實例化都會開闢一塊新的內存。
1.2 實現
在定義靜態屬性的時候,就使用new將對象進行創建。具體的GirlFirend代碼如下:
package com.kfit.singleton.hungry;
public class GirlFriend { private static GirlFriend instance = new GirlFriend();
public static GirlFriend getInstance() { return instance; }
public void playWithMe(){ System.out.println("女朋友陪我玩 - 有一個女朋友真好"); }
public void shoppingWithMe(){ System.out.println("陪女朋友去購物 - 我已經是快四大皆空了(支付寶、微信錢包、銀行卡、錢包 都空空如也了)"); }}二、單例模式-餓漢模式:小結
餓漢模式:類加載的初始化階段就完成了類的實例化。
(1)避免new對象:構造方法私有化。
(2)線程安全問題:利用JVM類加載機制來保證線程安全問題。
(3)如何確保唯一性:藉助JVM類加載機制,保證實例的唯一性。
(4)什麼時候被實例化的:在類加載的最後一步類的初始化(只有在真正使用對應的類的時候,才會觸發類加載進行初始化,對靜態變量進行類的實例化)。
(5)類什麼時候會被加載:當我們調用GirlFriend.getInstance()的時候,會判斷類型GirlFriend類是否已經被加載了,沒有被加載的話,就會執行JVM的類加載過程(加載-驗證-準備-解析-初始化)。
4. 單例模式的實現-靜態內部類-懶加載的一種方式
接下來我們來看下靜態內部類的實現方式:
一、單例模式-靜態內部類
1.1 定義
使用類的靜態內部類持有靜態對象的方式來實現單例,屬於懶加載的一種實現。
1.2 實現
在單例的類中,需要定義一個靜態內部類,在靜態內部類進行定義一個外部類的靜態變量,並且使用new進行對象的創建。具體代碼如下:
package com.kfit.singleton.innerclass;
public class GirlFriend {
public void playWithMe(){ System.out.println("女朋友陪我玩 - 有一個女朋友真好"); }
public void shoppingWithMe(){ System.out.println("陪女朋友去購物 - 我已經是快四大皆空了(支付寶、微信錢包、銀行卡、錢包 都空空如也了)"); }
private GirlFriend() { }
private static class InnerClassHolder{ private static GirlFriend instance = new GirlFriend(); }
public static GirlFriend getInstance(){ return InnerClassHolder.instance; }}二、單例模式-靜態內部類:小結
靜態內部類:使用類的靜態內部類持有靜態對象的方式來實現單例,屬於懶加載的一種實現。
(1)避免new對象:構造方法私有化。
(2)線程安全問題:利用JVM類加載機制來保證線程安全問題。
(3)如何確保唯一性:藉助JVM類加載機制,保證實例的唯一性。
(4)什麼時候被實例化的:在執行返回InnerClassHolder.instance的時候觸發類加載機制進行加載InnerClassHolder進行初始化,從而對GirlFriend進行實例化。
5. 單例模式的實現-枚舉類型
這一節我們看下通過枚舉類型來實現的單例。
一、單例模式-枚舉類型
1.1 定義
通過枚舉類型的特殊性,直接定義屬性就是當前的實例對象來進行單例的實現。
1.2 實現
直接定義枚舉類即可:
GirlFriend的代碼:
package com.kfit.singleton.enumsingleton;
public enum GirlFriend { INSTANCE;
public void playWithMe(){ System.out.println("女朋友陪我玩 - 有一個女朋友真好"); }
public void shoppingWithMe(){ System.out.println("陪女朋友去購物 - 我已經是快四大皆空了(支付寶、微信錢包、銀行卡、錢包 都空空如也了)"); }}測試代碼:
public class Test { public static void main(String[] args) {
GirlFriend girlFriend = GirlFriend.INSTANCE; GirlFriend girlFriend2 = GirlFriend.INSTANCE; System.out.println(girlFriend==girlFriend2); }}二、單例模式-枚舉類型:小結
枚舉類型:通過枚舉類型的特殊性,直接定義屬性就是當前的實例對象來進行單例的實現。
(1)避免new對象:枚舉類型的特性,不能直接new。
(2)線程安全問題:利用JVM類加載機制來保證線程安全問題。
(3)如何確保唯一性:藉助JVM類加載機制,保證實例的唯一性。
(4)什麼時候實例化的:在類加載的時候會執行靜態代碼塊進行實例化。
我就是我,是顏色不一樣的煙火。
我就是我,是與眾不同的小蘋果。à悟空學院:https://t.cn/Rg3fKJD
學院中有Spring Boot相關的課程!點擊「閱讀原文」進行查看!
SpringBoot視頻:http://t.cn/A6ZagYTi
SpringBoot交流平臺:https://t.cn/R3QDhU0
SpringSecurity5.0視頻:http://t.cn/A6ZadMBe
ShardingJDBC分庫分表:http://t.cn/A6ZarrqS
分布式事務解決方案:http://t.cn/A6ZaBnIr
JVM內存模型調優實戰:http://t.cn/A6wWMVqG
Spring入門到精通:https://t.cn/A6bFcDh4
大話設計模式之愛你:https://dwz.cn/wqO0MAy7