1. 程式人生 > >五種常見的單例模式及其效率測試

五種常見的單例模式及其效率測試

所謂單例模式就是不管你此時new多少新物件,它只會創建出一個物件供你使用。
最基礎的兩種單例模式是:餓漢式和懶漢式。
而還有三種常見的單例模式:雙重檢測鎖模式、靜態內部類實現和列舉類實現模式。


懶漢式:

    /**

     * 測試懶漢式單例模式

     * 延時載入,用到了才建立物件,提高了資源的利用率。

     * 但由於需要用到同步,導致併發效率很低。

     * @author Administrator


     */

public class SingletonDemo2 {

    private static SingletonDemo2 s2;

    //構造器私有化
    private SingletonDemo2() {
    }

    //這裡要加上同步,否則不能實現單例
    public static synchronized SingletonDemo2 getInstance() {

        //判斷s2是否為空,如果為空,則建立一個新物件。
        if(s2 == null) {
            s2 = new SingletonDemo2();
        }

        return s2;

    }
}

餓漢式:

/**

 * 測試餓漢單例模式

 * 餓漢式單例模式無延時載入。

 * @author Administrator

 */

public class SingletonDemo1 {

    //在建立物件的時候用類載入器初始化, 
    //類載入器在載入的時候是一個天然的執行緒安全
    //不需要用保持同步來保證執行緒安全

    private static SingletonDemo1 instanc = new SingletonDemo1();

    private SingletonDemo1(){
    }
    //隨用隨載入,無延時
    public static SingletonDemo1 getInstanc() {
        return instanc;
    }
}

雙重檢測鎖:
-由於JVM底層內部模型原因,偶爾會出問題,不建議使用。所以相應程式碼不在這裡顯示了。

靜態內部類實現:

/**
 * 測試靜態內部類實現方式
 * 延遲載入
 * 執行緒安全
 * 併發高效呼叫
 * @author Administrator
 */
public class SingletonDemo3 {

    //靜態內部類,並私有化
    private static class SingletonDemo3ClassInstance{
        private static SingletonDemo3 instance = new SingletonDemo3();
    }
    //沒有同步,呼叫效率高
    public static SingletonDemo3 getinstance() {
        return SingletonDemo3ClassInstance.instance;
    }

    private SingletonDemo3(){
    }
}

列舉類:

/**
 * 列舉式實現單例模式
 * 執行緒安全
 * 防止反射和反序列化操作破解
 * 無延時載入
 * @author Administrator
 */
 public enum SingletonDemo4 {
     //列舉元素是天然的執行緒安全
     INSTANCE;
}

總結如下:

常見的五種單例模式實現方式
主要:
    -餓漢式(執行緒安全,呼叫效率高;但是不能延時載入)
    -懶漢式(執行緒安全,呼叫效率不高,但是可以延時載入)
其他:
    -雙重檢測鎖式(由於JVM底層內部模型原因,偶爾會出問題,不建議使用)
    -靜態內部類式(執行緒安全,呼叫效率高,但是,可以延時載入)
    -列舉類(執行緒安全,呼叫效率高,防反射和反序列化,不能延時載入)

如何選用?
-單例物件 佔用資源少,不需要延時載入時:
    列舉類  好於 餓漢式
-單例物件 佔用資源大,需要延時載入時:
    靜態內部類式 好於 懶漢式

五種方式效率測試:
這裡寫圖片描述