1. 程式人生 > 實用技巧 >java處理redis的幾種序列化策略

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