java處理redis的幾種序列化策略
什麼是單例設計模式?
單例模式,是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中,應用該模式的類一個類只有一個例項。即一個類只有一個物件例項。
類結構圖
具體實現
需要:
(1)將構造方法私有化,使其不能在類的外部通過new關鍵字例項化該類物件。
(2)在該類內部產生一個唯一的例項化物件,並且將其封裝為private static型別。
(3)定義一個靜態方法返回這個唯一物件。
實現一:立即載入 / “餓漢模式”
立即載入就是使用類的時候已經將物件建立完畢(不管以後會不會使用到該例項化物件,先建立了再說。很著急的樣子,故又被稱為“餓漢模式”),常見的實現辦法就是直接new例項化。
public class Singleton { // 將自身例項化物件設定為一個屬性,並用static、final修飾 private static final Singleton instance = new Singleton(); // 構造方法私有化 private Singleton() {} // 靜態方法返回該例項 public static Singleton getInstance() { return instance; } }
“餓漢模式”的優缺點:
優點:實現起來簡單,沒有多執行緒同步問題。
缺點:當類SingletonTest被載入的時候,會初始化static的instance,靜態變數被建立並分配記憶體空間,從這以後,這個static的instance物件便一直佔著這段記憶體(即便你還沒有用到這個例項),當類被解除安裝時,靜態變數被摧毀,並釋放所佔有的記憶體,因此在某些特定條件下會耗費記憶體。
實現二:延遲載入 / “懶漢模式”
延遲載入就是呼叫get()方法時例項才被建立(先不急著例項化出物件,等要用的時候才給你創建出來。不著急,故又稱為“懶漢模式”),常見的實現方法就是在get方法中進行new例項化。
public class Singleton { // 將自身例項化物件設定為一個屬性,並用static修飾 private static Singleton instance; // 構造方法私有化 private Singleton() {} // 靜態方法返回該例項 public static Singleton getInstance() { if(instance == null) { instance = new Singleton(); } return instance; } }
“懶漢模式”的優缺點:
優點:實現起來比較簡單,當類SingletonTest被載入的時候,靜態變數static的instance未被建立並分配記憶體空間,當getInstance方法第一次被呼叫時,初始化instance變數,並分配記憶體,因此在某些特定條件下會節約了記憶體。
缺點:在多執行緒環境中,這種實現方法是完全錯誤的,根本不能保證單例的狀態。
實現三:執行緒安全的“懶漢模式”
public class Singleton { // 將自身例項化物件設定為一個屬性,並用static修飾 private static Singleton instance; // 構造方法私有化 private Singleton() {} // 靜態方法返回該例項,加synchronized關鍵字實現同步 public static synchronized Singleton getInstance() { if(instance == null) { instance = new Singleton(); } return instance; } }
優點:在多執行緒情形下,保證了“懶漢模式”的執行緒安全。
缺點:眾所周知在多執行緒情形下,synchronized方法通常效率低,顯然這不是最佳的實現方案。
實現四:DCL雙檢查鎖機制(DCL:double checked locking)
public class Singleton { // 將自身例項化物件設定為一個屬性,並用static修飾 private static Singleton instance; // 構造方法私有化 private Singleton() {} // 靜態方法返回該例項 public static Singleton getInstance() { // 第一次檢查instance是否被例項化出來,如果沒有進入if塊 if(instance == null) { synchronized (Singleton.class) { // 某個執行緒取得了類鎖,例項化物件前第二次檢查instance是否已經被例項化出來,如果沒有,才最終例項出物件 if (instance == null) { instance = new Singleton(); } } } return instance; } }
方法四算是單例模式的最佳實現方式。記憶體佔用率高,效率高,執行緒安全,多執行緒操作原子性。
參考
1、高洪巖,Java多執行緒程式設計核心技術,機械工業出版社
2、https://www.cnblogs.com/binaway/p/8889184.html