1. 程式人生 > >單例模式(簡單使用)

單例模式(簡單使用)

span on() 內部類 一個 單例 線程 類裝載 syn limit

簡介

單例模式是一種常用的軟件設計模式,其定義是單例對象的類只能允許一個實例存在。

雙重檢查模式[推薦使用]

  1、線程安全

public class Singleton {
  //將構造器私有化

  private Singleton() {}
  //初始化一個靜態常量
   private static volatile Singleton singleton;
  //構造一個靜態方法,通過它來初始化或反還對象
   public static Singleton getInstance() {
     //雙重檢查機制 if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } }

餓漢模式(靜態常量)[可用]

  1、線程安全

   缺點:在類裝載的時候就完成實例化,沒有達到Lazy Loading的效果。如果從始至終從未使用過這個實例,則會造成內存的浪費。

public class Singleton {

    private final static Singleton INSTANCE = new Singleton();

    private Singleton(){}

    public static Singleton getInstance(){
        return INSTANCE;
    }
}

還有一種寫法(靜態代碼塊)

public class Singleton {

    private static Singleton instance;

    static {
        instance = new Singleton();
    }

    private Singleton() {}

    public Singleton getInstance() {
        return instance;
    }
}

靜態內部類[可用]

  1、線程安全

  2、充分利用了靜態內部類的特性,在裏面初始化 類 實例

   3、只會被初始化一次

  4、只有當靜態內部類內部的屬性、方法等被調用的時候,靜態內部類才會被加載

public class Boss {
    // 1. 將構造器私有化
    private Boss() { }

    // 2. 充分利用了靜態內部類的特性,在裏面初始化 Boss 實例
    //    - 只會被初始化一次
    //    - 只有當靜態內部類內部的屬性、方法等被調用的時候,靜態內部類才會被加載
    static class Singleton {
        private final static Boss INSTANCE = new Boss();
    }

    // 3. 提供一個公共方法,獲取實例化好之後的對象
    public static Boss getInstance() {
        return Singleton.INSTANCE;
    }
}

懶漢模式[不可用]

  1、線程不安全

  2、這種寫法起到了Lazy Loading的效果,但是只能在單線程下使用。如果在多線程下,一個線程進入了if (singleton == null)判斷語句塊,還未來得及往下執行,另一個線程也通過了這個判斷語句,這時便會產生多個實例。所以在多線程環境下不可使用這種方式

public class Singleton {

    private static Singleton singleton;

    private Singleton() {}

    public static Singleton getInstance() {
        if (singleton == null) {
            singleton = new Singleton();
        }
        return singleton;
    }
}

懶漢模式(線程安全,同步方法)【不推薦使用】

  1、缺點:效率太低了,每個線程在想獲得類的實例時候,執行getInstance()方法都要進行同步。而其實這個方法只執行一次實例化代碼就夠了,後面的想獲得該類實例,直接return就行了。方法進行同步效率太低要改進。

public class Singleton {

    private static Singleton singleton;

    private Singleton() {}

    public static synchronized Singleton getInstance() {
        if (singleton == null) {
            singleton = new Singleton();
        }
        return singleton;
    }
}

 。

單例模式(簡單使用)