定義
保證一個類僅有一個實例,並提供一個訪問它的全局訪問點
七種寫法
1.餓漢式(簡潔直觀)
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return INSTANCE;
}
}
2.枚舉(餓漢式的變種,最簡潔)
public enum Singleton {
INSTANCE;
}
枚舉類型默認構造是私有的
3.靜態代碼快(餓漢式的變種,適合複雜的實例化(如外部資源導入等))
public class Singleton {
private static final Singleton INSTANCE;
private Singleton(){
}
static {
INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return INSTANCE;
}
}
4.懶漢式(線程不安全,適用於單線程)
public class Singleton {
private static Singleton instance = null;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
5.雙重檢測鎖(DCL,懶漢式的改進,實現線程安全(同步),適用於多線程)
public class Singleton {
private static volatile Singleton instance = null;
private Singleton (){
}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
6.靜態內部類(懶漢式的改進,適用於多線程)
public class Singleton {
private Singleton() {
}
private static class InnerClass {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return InnerClass.INSTANCE;
}
}
7.容器(懶漢式的一種,適用於多線程)
public class Singleton {
private static Map<String,Object> map=new HashMap<String, Object>();
private Singleton(){
}
public static void registerService(String key,Object instance){
if (!map.containsKey(key)){
map.put(key,instance);
}
}
public static Object getService(String key){
return map.get(key);
}
}