單例模式 之 單例模式——Holder


之前我寫過 單例模式中的餓漢模式和懶漢模式

他們雖然都能實現單例模式 但是優缺點很明顯

餓漢模式:不能懶加載(類加載就會被實例化),消耗很大,在並發情況下安全性很高。

懶漢模式:能實現懶加載,但是在並發情況下安全性不是很高。雖然一步一步的優化,安全性得到了保證,但是卻使用了synchronized 對性能有所影響。

 

今天記錄一下 Holder 模式

它結合了餓漢模式 安全性,也結合了懶漢模式懶加載。不會使用synchronized 所以性能也有所保證。

 

代碼:Holder 模式與其說是 餓漢模式和懶漢模式相結合,不如說是思維的更高一層的表現。23種設計模式是(短期)不會變的,但是思想會變。

Holder 模式就是將我們要構造的實例交於其內部類進行實例。

private :表明不能被他人調用,

static: 靜態的內部類 不會率先被加載,只有主類被調用的時候被加載(解決了懶加載問題),並且 

private static HolderSingleton instance=new HolderSingleton(); 只會加載一次。
/**
 * Holder模式
 */
public class HolderSingleton {

    private HolderSingleton(){}

    /**
     * 私有的 靜態 內部類
    類級的內部類,也就是靜態的成員式內部類,該內部類的實例與外部類的實例 沒有綁定關系,而且只有被調用到時才會裝載,從而實現了延遲加載。 
*/ private static class HolderDemo{ private static HolderSingleton instance=new HolderSingleton(); } public static HolderSingleton getInstance(){ return HolderDemo.instance; } /** * 測試 * @param args */ public static void main(String[] args) { for(int i=0;i<20;i++){ new Thread(()->{ System.out.println(HolderSingleton.getInstance()); }).start(); } } }

測試結果:

com.company.HolderSingleton@616831d4
com.company.HolderSingleton@616831d4
com.company.HolderSingleton@616831d4
com.company.HolderSingleton@616831d4
com.company.HolderSingleton@616831d4
com.company.HolderSingleton@616831d4
com.company.HolderSingleton@616831d4
com.company.HolderSingleton@616831d4
com.company.HolderSingleton@616831d4
com.company.HolderSingleton@616831d4
com.company.HolderSingleton@616831d4
com.company.HolderSingleton@616831d4
com.company.HolderSingleton@616831d4
com.company.HolderSingleton@616831d4
com.company.HolderSingleton@616831d4
com.company.HolderSingleton@616831d4
com.company.HolderSingleton@616831d4
com.company.HolderSingleton@616831d4
com.company.HolderSingleton@616831d4
com.company.HolderSingleton@616831d4

Process finished with exit code 0

 

其實很想聊聊 static 機制的, 發現自己也是懵懵懂懂,待到以后仔細研究一下在另外寫一篇關於 static的文章吧。

之所以說 靜態的內部類會在主類調用的時候才會被加載,也是我看別人這沒說(很多人也是這沒說)。以后真正了解了static 才敢保證正確與否,不過此種方式確實刷新了我的認識

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM