單例模式的三種實現及區別
阿新 • • 發佈:2019-02-19
單例模式的三種實現方法 in Java
單例模式,是GoF23個設計模式中比較常見的一種,主要目的是讓某個類只存在一個例項。本人將列舉出3種單例模式的Java實現。
方法一 不能帶參的建構函式
本人使用的idea,在建立一個類的時候,會有一個Singleton的選項,選擇這種方式生成的類,就屬於該種寫法。這種寫法比較簡便,缺點也比較明顯
具體程式碼如下:
public class Coraline { private static Coraline ourInstance = new Coraline(); public static Coraline getInstance() { return ourInstance; } private Coraline() { } }
方法二 帶同步鎖的單例
這種寫法比較常見,主要涉及到synchronized關鍵字,具體的見下篇。需要注意synchronized關鍵字上鎖的粒度,當synchronized加在class前面時,鎖定的就是整個類;當加在類中的某個方法時,鎖定的也是整個類;這種寫法的程式碼如下:
public class Coraline { private static Coraline ourInstance = new Coraline(); private static Object lock = new Object(); public static Coraline getInstance() { synchronized (lock){ if(ourInstance == null){ ourInstance = new Coraline(); return ourInstance; } return ourInstance; } } private Coraline() { } }
方法三 雙檢鎖
雙檢鎖顧名思義的是指雙重檢查,這裡的雙重檢查,其實是為了更好的提高效率,因為需要加鎖的情況,僅發生在需要建立這個類的例項,所以可以減低鎖的粒度,在不用建立的情況下,不進行加鎖,更好的提高了效率,是推薦的寫法。具體程式碼如下:
public class Coraline { private static Coraline ourInstance = new Coraline(); private static Object lock = new Object(); public static Coraline getInstance() { if(ourInstance == null){ synchronized (lock){ if(ourInstance == null){ ourInstance = new Coraline(); } } } return ourInstance; } private Coraline() { } }