學習設計模式的時候 ,往往第乙個就是單例模式,啥是單例模式呢?接下來我就為大家梳理一下7種寫法
1.定義
ensure a class has only one instance, and provide a global point of access to it.(確保某乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。)
2,單例模式滿足條件
1.構造方法必須進行私有化
2.例項必須是乙個且唯一,並且必須加上static屬性
3.對外提供獲取該類物件的共有方法也是static屬性
3. 單例模式寫法
餓漢式(靜態常量,靜態**塊) 都是執行緒安全的
懶漢式(執行緒不安全,執行緒安全,同步**塊,雙重檢驗)
靜態內部類 列舉
寫之前科普一下,啥是餓漢式====> 在程式建立的時候就進行初始化,並且物件唯一 , 反之懶漢式 需要時才建立於堆中
3.1,靜態常量餓漢式寫法
/**
* 靜態常量餓漢式
優點:這種寫法比較簡單,就是在類裝載的時候就完成例項化。避免了執行緒同步問題。
缺點:在類裝載的時候就完成例項化,沒有達到lazy loading的效果。如果從始至終從未使用過這個例項,則會造成記憶體的浪費。
*/public class singleton
private final static singleton instance = new singleton();
private static singleton getinstance()
}
3.2,靜態**塊餓漢式寫法
/**
* 靜態**塊餓漢式 與靜態常量類似
* 只不過將類例項化的過程放在了靜態**塊中,也是在類裝載的時候,就執行靜態**塊中的**,初始化類的例項。
*/class singleton1
static
private static singleton1 getinstance()
}
3.3, 執行緒不安全懶漢式寫法
/**
* 執行緒不安全懶漢式 適合單執行緒
* 如果在多執行緒下,乙個執行緒進入了if (null == instance)判斷語句塊,還未來得及往下執行,
* 另乙個執行緒也通過了這個判斷語句,這時便會產生多個例項。所以在多執行緒環境下不可使用這種方式。
*/public class singleton2
private static singleton2 getinstance()
return instance;
}}
3.4, 執行緒安全懶漢式寫法 synchronized
/**
* 執行緒安全懶漢式 + synchronized 關鍵字
* 效率太低了,每個執行緒在想獲得類的例項時候,執行getinstance()方法都要進行同步。
* 而其實這個方法只執行一次例項化**就夠了,後面的想獲得該類例項,直接return就行了。方法進行同步效率太低要改進。
*/class singleton3
private static synchronized singleton3 getinstance()
return instance;
}}
3.5, 同步**塊懶漢式寫法
/**
* 同步**塊懶漢式
* 改為同步產生例項化的的**塊。但是這種同步並不能起到執行緒同步的作用。跟第3種實現方式遇到的情形一致,
* 假如乙個執行緒進入了if (null == instance)判斷語句塊,還未來得及往下執行,另乙個執行緒也通過了這個判斷語句,這時便會產生多個例項。
*/class singleton4
private static synchronized singleton4 getinstance()
return instance;
}}
3.6,雙重檢查懶漢式寫法
/** 雙重檢查(推薦使用)
* * double-check概念對於多執行緒開發者來說不會陌生,如**中所示,
* * 我們進行了兩次if (singleton == null)檢查,這樣就可以保證執行緒安全了。
* * 這樣,例項化**只用執行一次,後面再次訪問時,判斷if (singleton == null),直接return例項化物件。
* * 優點:執行緒安全;延遲載入;效率較高。
*/class singleton5
private static singleton5 getinstance()}}
return instance;
}}
3.7,靜態內部類寫法
/**
* 靜態內部類
* 這種方式跟餓漢式方式採用的機制類似,但又有不同。兩者都是採用了類裝載的機制來保證初始化例項時只有乙個執行緒。不同的地方在餓漢式方式是只要singleton類被裝載就會例項化,沒有lazy-loading的作用,而靜態內部類方式在singleton類被裝載時並不會立即例項化,而是在需要例項化時,呼叫getinstance方法,才會裝載singletoninstance類,從而完成singleton的例項化。
* * 類的靜態屬性只會在第一次載入類的時候初始化,所以在這裡,jvm幫助我們保證了執行緒的安全性,在類進行初始化時,別的執行緒是無法進入的。
* * 優點:避免了執行緒不安全,延遲載入,效率高。
*/class singleton6
private static class singletoninstance
private static singleton6 getinstance()
}
ps 未完待續。。。
**位址 :
歡迎star
白話設計模式之 單例模式
先說定義 單例模式是為了保證乙個物件在乙個系統中之有乙份執行中的例項 這個在生活中可以舉很多例子 例如 給水桶接水的事件中,客觀的條件上來說,就只有乙個水桶 因此在系統設計中,單個水桶在接水的事件中就必須是單例的。銀行對某個人賬戶的操作也是也必須保證賬戶中的總金額,支出和收入計算出來不能出現偏差 這...
設計模式系列 單例模式的7種寫法
單例模式是一種常用的軟體設計模式,在他的核心結構中只包含乙個被稱為 單例的特殊類。通過單例模式可以保證系統只有乙個例項而且該例項易於外界訪問,從而方便對例項個數的控制並節約系統資源。如果希望在系統中某個類的物件只能存在乙個,單例模式是最好的解決方案。singletom類,定義乙個getinstanc...
23種設計模式之單例模式(8種寫法)
23種設計模式之單例模式 8種寫法 餓漢式 高效 沒有執行緒安全問題 簡單 jvm保證執行緒安全問題 public class merge01 public static merge01 getinstance public static void main string args 用靜態塊初始化 ...