單例模式 介紹 模式:創建型 意圖:保證一個類只有一個實例,並提供一個訪問它的全局訪問點 解決:一個全局使用的類頻繁地創建與銷毀 場景: 唯一序列號 web中的計數器 I/O與資料庫的連接 …… 唯一序列號 web中的計數器 I/O與資料庫的連接 …… 實現方式 餓漢式 :靜態載入,線程安全 餓漢式 ...
單例模式
介紹
- 模式:創建型
- 意圖:保證一個類只有一個實例,並提供一個訪問它的全局訪問點
- 解決:一個全局使用的類頻繁地創建與銷毀
- 場景:
- 唯一序列號
- web中的計數器
- I/O與資料庫的連接
- ……
實現方式
-
餓漢式 :靜態載入,線程安全
1 /** 2 * 單例模式:餓漢式 3 * 是否Lazy初始化:否 4 * 是否多線程安全:是 5 */ 6 public class Singleton { 7 8 private static Singleton singleton = new Singleton(); 9 10 // 構造器私有 11 private Singleton() { 12 } 13 14 // 實例方法 15 public static Singleton getInstance() { 16 return singleton; 17 } 18 }Singleton.java
-
懶漢式:單校驗,線程不安全
1 /** 2 * 單例模式:懶漢式 3 * 是否Lazy初始化:是 4 * 是否多線程安全:否 5 */ 6 public class Singleton { 7 8 private static Singleton singleton; 9 10 // 構造器私有 11 private Singleton() { 12 13 } 14 15 // 實例方法 16 public static Singleton getInstance() { 17 if (singleton == null) { 18 return new Singleton(); 19 } 20 return singleton; 21 } 22 }Sington.java
-
懶漢式:實例方法同步鎖,線程安全
1 /** 2 * 單例模式:懶漢式 3 * 是否Lazy初始化:是 4 * 是否多線程安全:是 5 */ 6 public class Singleton { 7 8 private static Singleton singleton; 9 10 // 構造器私有 11 private Singleton() { 12 13 } 14 15 // 實例方法 16 public static synchronized Singleton getInstance() { 17 if (singleton == null) { 18 return new Singleton(); 19 } 20 return singleton; 21 } 22 }Sington.java
-
懶漢式:雙檢鎖/雙重校驗鎖(DCL,double-checked locking),線程安全
1 /** 2 * 單例模式:懶漢式 3 * 是否Lazy初始化:是 4 * 是否多線程安全:是 5 */ 6 public class Singleton { 7 8 private static volatile Singleton singleton; 9 10 // 構造器私有 11 private Singleton() { 12 13 } 14 15 // 實例方法 16 public static Singleton getInstance() { 17 if (singleton == null) { 18 synchronized (Singleton.class) { 19 if (singleton == null) { 20 return new Singleton(); 21 } 22 } 23 } 24 return singleton; 25 } 26 }Sington.java
-
登記式/靜態內部類:線程安全
1 /** 2 * 單例模式:登記式/靜態內部類 3 * 是否Lazy初始化:是 4 * 是否多線程安全:是 5 */ 6 public class Singleton { 7 8 // 靜態內部類持有 9 private static class SingletonHolder { 10 private static final Singleton SINGLETON = new Singleton(); 11 } 12 13 // 構造器私有 14 private Singleton() { 15 16 } 17 18 // 實例方法 19 public static Singleton getInstance() { 20 return SingletonHolder.SINGLETON; 21 } 22 }Sington.java
-
枚舉:線程安全
1 /** 2 * 單例模式:枚舉 3 * 是否Lazy初始化:否 4 * 是否多線程安全:是 5 */ 6 public enum Singleton { 7 SINGLETON 8 }Singleton.java