http://blog.csdn.net/cselmu9/article/details/51366946java
單例模式安全
單例模式是對象的建立模式之一,此外還包括工廠模式。單例模式有以下幾個特色:併發
1:該類只有一個實例。函數
2:該類自行建立該實例,在該類內部建立自身的實例對象。高併發
3:向整個系統公開這個實例接口。性能
package com.wbx.design; import test.C; public class Singleton { //私有,靜態的類自身實例 private static Singleton instance = new Singleton(); //私有構造函數 private Singleton(){ //2:構造函數 System.out.println("aaaaaaaaa"); } //公開,靜態的工廠方法 public static Singleton getInstance(){ //3 System.out.println("bbbb"); return instance; } C c = new C(); //1:屬性類的構造函數 }
上面代碼片斷中引入建立對象C,爲了看看類中代碼的執行順序。測試
public static void main(String[] args) { Singleton s1 = getInstance(); Singleton s2 = getInstance(); Singleton s3 = getInstance(); System.out.println("s1=="+s1); System.out.println("s2=="+s2); System.out.println("s3=="+s3); C c1 = new C(); //1:屬性類的構造函數 C c2 = new C(); //1:屬性類的構造函數 C c3 = new C(); //1:屬性類的構造函數 System.out.println("c1=="+c1); System.out.println("c2=="+c2); System.out.println("c3=="+c3); }
測試結果優化
ccccccccccc aaaaaaaaa bbbb bbbb bbbb s1==com.wbx.design.Singleton@2f581b9f s2==com.wbx.design.Singleton@2f581b9f s3==com.wbx.design.Singleton@2f581b9f ccccccccccc ccccccccccc ccccccccccc c1==test.C@417d7c01 c2==test.C@1558473e c3==test.C@56ad4264
1:優勢spa
a:減小內存消耗,特別是一個對象若是頻繁地建立、銷燬,並且建立或銷燬時性能沒法優化,這時採用單例模式的優點就很是明顯。.net
b:當一個對象產生須要比較多的資源時,如讀取配置、產生其餘對象時,則能夠經過在應用啓動時直接產生一個對象,而後永久駐留內存的方式來解決(在Java EE中採用單例模式時須要注意JVM垃圾回收機制);
c:單例模式能夠在系統中設置全局的訪問點,優化共享資源的訪問,例如能夠設計一個單例類,負責全部數據表的映射處理。
2:缺點
a:單例模式沒有接口,擴展很困難,接口對單例模式是沒有任何意義,它要求「自行實例化」,而且提供單一實例、接口或抽象類是不可能被實例話的。
b:單例模式與單一職責原則有衝突。一個類應該只實現一個的邏輯,而不關係它是不是單例的,決定它是否是要單例是環境決定的,單例模式把「要單例」和業務邏輯融合在一個類中。