單例模式(Singleton) : 是一種經常使用的軟件設計模式。 在它的核心結構中只包含一個被稱爲單例的特殊類。 設計模式
經過單例模式能夠保證系統中, 應用該模式的類一個類只有一個實例, 即一個類只有一個對象實例。 安全
目的是爲了節省重複建立對象所帶來的內存消耗, 從而來提升效率 。
多線程
實現核心點:工具
1.構造方法私有化;測試
2.聲明一個本類對象(靜態);spa
3.給外部提供一個靜態方法獲取對象實例。
線程
餓漢式實現: 在類被加載後, 對象被建立, 到程序結束後釋放 。 | 懶漢式實現: 在第一次調用getInstance方法時, 對象被建立,到程序結束後釋放。 |
//餓漢式: 佔用內存的時間長, 提升效率 class Singleton1{ private Singleton1(){} private static Singleton1 s = new Singleton1(); public static Singleton1 getInstance(){ return s; } public void print(){ System.out.println("測試方法"); } } |
//懶漢式: 佔用內存的時間短, 效率低(懶加載,延遲加載) class Singleton2{ private Singleton2(){}; private static Singleton2 s; public static Singleton2 getInstance(){ if(s==null){ s = new Singleton2(); } return s; } public void print(){ System.out.println("測試方法2"); } } |
單例模式在實際開發中的應用:
1.在設計一些工具類的時候(一般工具類, 只有功能方法, 沒有屬性) ;
2.工具類可能會被頻繁調用 。
單例懶漢式的線程安全問題:能夠經過synchronized 關鍵字來解決多線程的線程安全問題。
public class Singleton { // 將自身實例化對象設置爲一個屬性, 並用static修飾 // 靜態方法返回該實例, 加synchronized關鍵字實現同步 return s; |
但在多線程情形下, synchronized方法一般效率低, 顯然這不是最佳的實現方案。
DCL雙檢查鎖機制(DCL: double checked locking) :單例模式的最佳實現方式。 內存佔用率高, 效率高, 線程安全, 多線程操做原子性。
public class Singleton { // 構造方法私有化 // 將自身實例化對象設置爲一個屬性, 並用static修飾 // 靜態方法返回該實例 // 第一次檢查instance是否被實例化出來, 若是沒有進入if塊 return s; }} |