之前我寫過 單例模式中的餓漢模式和懶漢模式
他們雖然都能實現單例模式 但是優缺點很明顯
餓漢模式:不能懶加載(類加載就會被實例化),消耗很大,在並發情況下安全性很高。
懶漢模式:能實現懶加載,但是在並發情況下安全性不是很高。雖然一步一步的優化,安全性得到了保證,但是卻使用了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 才敢保證正確與否,不過此種方式確實刷新了我的認識