單例是一種設計模式,指該類被建立後有且僅有乙個例項供外部訪問,並且提供乙個全域性的訪問入口。
有三個核心點:
1、類的構造方法私有化
2、內部產生該類的例項化物件,並宣告為private static
3、定義乙個靜態方法返回該類的例項
常見的單例模式有下面幾種。
一、飽漢方式
public class singleton
public static singleton getinstance()
return singleton;
}}
該方式不能算真正的單例模式,在多執行緒環境下根本無法實現單例項。
二、飽漢-執行緒安全
public class singleton
public static synchronized singleton getinstance()
return singleton;
}}
實現了執行緒的同步,但是synchronized 的粗暴導致該方式效能低下。
三、餓漢方式
public class singleton
public static singleton getinstance()
}
所謂餓漢即一開始就宣告示例,是通過類載入的方式避免了多執行緒同步問題。在類初始化是例項化singleton。
四、餓漢-靜態**塊
public class singleton
static
public static singleton getinstance()
}
在編碼上跟餓漢方式有很大區別,但是實際區別不大,都是在類初始化時候例項化singleton。
五、靜態內部類
public class singleton
private static class singletonholder
public static final singleton getinstance()
}
該方式也是利用classloader保證単例項,但是跟餓漢模式還是有很大區別的,餓漢是在類初始化時候已經例項化了singleton,但是靜態內部類只有在真正呼叫getinstance()時候才會例項化singleton,故真正意義上實現了懶載入。
六、雙重校驗
public class singleton
public static singleton getinstance()}}
return singleton;
}}
該方式是餓漢-執行緒安全方式的變種,且大大提高了效能。但是請注意寫法使用了volatile 關鍵字,為什麼?主要還是跟jvm的制令重排有關係,導致執行緒獲取未完全初始化的例項。
singleton = new singleton(); 的過程經歷了三個步驟。
1、在堆中為singleton開闢記憶體空間,分配位址。
2、執行建構函式初始化
3、將記憶體位址賦值給singleton 。
如果是經過了指令重排後,那麼2、3步驟將交換。試想如果在執行完步驟3,還未開始執行2,另外的執行緒在執行到第乙個if判斷是,此時的singleton != null,那麼將返回乙個外完全初始化的singleton。
七、列舉方式
public enum singleton
}
關於列舉實現單例,這篇文章解釋的很詳細
就個人而言:
第一種飽漢模式根本就不能算是單例,三、四基本是一樣。五、六很經典。三、五是比較常用的。列舉模式好處還是多多的,就是平時用的很少而已。
單例模式實現(七種)
單例模式確保乙個類只有乙個例項,並提供乙個全域性訪問點,實現單例模式的方法是私有化建構函式,通過getinstance 方法例項化物件,並返回這個例項 保證在jvm中只有乙個例項 優點 1 單例類只有乙個例項 2 共享資源,全域性使用 3 節省建立時間,提高效能 public class singl...
單例模式的七種寫法
第一種 懶漢,執行緒不安全 public class singleton public static singleton getinstance return instance 第二種 懶漢,執行緒安全 public class singleton public static synchronize...
七種單例模式的寫法
餓漢式 特點 在類載入時例項化,執行緒安全,如果沒有使用instance的話比較耗費資源 class singletondemo public static singletondemo getinstance 懶漢式 非執行緒安全 特點 使用時再例項化 class singletondemo pub...