Java設計模式之001--單例模式

單例模式(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 {
  // 構造方法私有化
  private Singleton() {}

  // 將自身實例化對象設置爲一個屬性, 並用static修飾
  private static Singleton s;

  // 靜態方法返回該實例, 加synchronized關鍵字實現同步
  public static synchronized Singleton getInstance() {
    if(instance == null) {
      s= new Singleton();
    }

    return s;
  }
}

 



 

 

 

 

 

 

 

但在多線程情形下, synchronized方法一般效率低, 顯然這不是最佳的實現方案。 

DCL雙檢查鎖機制(DCLdouble checked locking) :單例模式的最佳實現方式。 內存佔用率高, 效率高, 線程安全, 多線程操做原子性。

public class Singleton {

  // 構造方法私有化
  private Singleton() {}

  // 將自身實例化對象設置爲一個屬性, 並用static修飾
  private volatile static Singleton s;

  // 靜態方法返回該實例
  public static Singleton getInstance() {

    // 第一次檢查instance是否被實例化出來, 若是沒有進入if
    if(s== null) {
      synchronized (Singleton.class) {
        // 某個線程取得了類鎖, 實例化對象前第二次檢查instance是否已經被實例化出來, 若是沒有, 才最終實例出對象
        if (s== null) {
          s= new Singleton();
        }
      }
    }

    return s;

  }}

相關文章
相關標籤/搜索