1. 程式人生 > >java設計模式(一)建立型模式之 單例模式(餓漢式,懶漢式,執行緒安全,雙重檢查)

java設計模式(一)建立型模式之 單例模式(餓漢式,懶漢式,執行緒安全,雙重檢查)

1.介紹

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

2.實現思路與步驟

  1).將該類的構造方法定義為私有方法,這樣其他處的程式碼就無法通過呼叫該類的構造方法來例項化該類的物件,只有通過該類提供的靜態方法來得到該類的唯一例項;

  2).在該類內提供一個靜態方法,當我們呼叫這個方法時,如果類持有的引用不為空就返回這個引用,如果類保持的引用為空就建立該類的例項並將例項的引用賦予該類保持的引用。

2.單例模式實現

   1)、餓漢式  

public class Singleton {

    private final static Singleton instance= new Singleton();

    private Singleton(){}

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

 優點:這種寫法比較簡單,就是在類裝載的時候就完成例項化。避免了執行緒同步問題。

 缺點:在類裝載的時候就完成例項化,沒有達到延遲載入的效果。如果從始至終從未使用過這個例項,則會造成記憶體的浪費。

 2)、懶漢式

public class Singleton {

    private static Singleton singleton;

    private Singleton() {}

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

優點:這種寫法起到了延遲載入的效果,僅適合於單執行緒環境

缺點: 如果在多執行緒下,一個執行緒進入了if (singleton == null)判斷語句塊,還未來得及往下執行,另一個執行緒也通過了這個判斷語句,這時便會產生多個例項

3)、懶漢式(執行緒安全,同步方法)

public class Singleton {

    private static Singleton singleton;

    private Singleton() {}

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

優點:解決了執行緒不安全的問題

缺點: 效率低,每個執行緒都要執行getInstance()方法進行同步。而其實這個方法只執行一次例項化程式碼就夠了,後面的想獲得該類的例項,直接return就行了

5) 雙重檢查

public class Singleton {

    private static volatile Singleton singleton;

    private Singleton() {}

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

       雙重檢測概念對於多執行緒開發者來說不會陌生,如程式碼中所示,我們進行了兩次if (singleton == null)檢查,這樣就可以保證執行緒安全了。這樣,例項化程式碼只用執行一次,後面再次訪問時,判斷if (singleton == null),直接return例項化物件。

優點:執行緒安全;延遲載入;效率較高。