什麼是單例模式(Singleton)?有哪幾種線程安全的實現方式?

世界上並沒有完美的程序,但是我們並不因此而沮喪,因爲寫程序就是一個不斷追求完美的過程。

  1. 意圖
    保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。節省內存。用途:計數器,全局唯一ID、連接等。
  2. 類圖
    在這裏插入圖片描述
  3. 實例
  • 實例中只展示線程安全的實現方式
// 第一種,並且是最好的實現方式,枚舉,餓漢式
enum Single1{
    SINGLETON;
    public void sayHello(){
        System.out.println("enum say hello");
    }
}

// 第二種,常規餓漢式
class Single2{
    private Single2(){}
    private static final Single2 SINGLE = new Single2();
    public static Single2 getInstance(){
        return SINGLE;
    }
    public void sayHello(){
        System.out.println("餓漢式 say hello");
    }
}

// 第三種,靜態內部類,懶漢式,懶漢式首選
class Single3{
    private Single3(){}
    private static class SingleHolder{
        private static final Single3 SNGLE = new Single3();
    }
    public static Single3 getInstance(){
        return SingleHolder.SNGLE;
    }
    public void sayHello(){
        System.out.println("inner static say hello");
    }
}

// 雙重校驗鎖, 懶漢式
class Single4{
    private Single4(){}
    private static Single4 single4;
    public static Single4 getInstance(){
        if(null == single4){
            synchronized (Single4.class){
                if(null == single4){
                    return new Single4();
                }
            }
        }
        return single4;
    }
    public void sayHello(){
        System.out.println("double judge say hello");
    }
}

// 直接加鎖,懶漢式,效率最低
class Single5{
    private Single5(){}
    private static Single5 single5;
    public static synchronized Single5 getInstance(){
        if(null == single5){
            return new Single5();
        }
        return single5;
    }
    public void sayHello(){
        System.out.println("normal sync lazy say hello");
    }
}
  1. 測試
class TestSingleton{
    public static void main(String[] args) {
        Single1.SINGLETON.sayHello();
        Single2.getInstance().sayHello();
        Single3.getInstance().sayHello();
        Single4.getInstance().sayHello();
        Single5.getInstance().sayHello();
    }
}

運行結果:

enum say hello
餓漢式 say hello
inner static say hello
double judge say hello
normal sync lazy say hello

想看更多嗎?請訪問:設計模式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章