單例模式學習筆記

1.飢漢模式 java

public class Singleton{ 

    //飢漢模式: 建立私有靜態化實例,在類初次加載時即初始化
    private static final Singleton instance = new Singleton();

    //將Singleton()構造方法級別置爲private 
    private Singleton(){};

    //公有靜態方法,獲取單例實例
    public static Singleton getInstance(){
        return instance;
    }

}

2.飽漢模式(雙重檢查)多線程

public class Singleton{
    
    //飽漢模式:在類初次加載時不進行實例初始化,當須要使用實例時初始化(volatile爲必須)
    private static volatile Singleton instance = null;

    //將Singleton()構造方法級別置爲private
    private Singleton(){};

    //雙重檢查,當實例instance爲null時,初始化該實例
    public static Singleton getInstance(){
        if( instance == null ){
            //加鎖
            synchronized(Singleton.class){
                if( instance == null ){
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }

}

3.靜態嵌套類(推薦)線程

public class Singleton{

    //將Singleton()構造方法級別置爲private
    private Singleton(){};

    //靜態嵌套類內部初始化實例
    private static class SingletonInstance{
        private static final Singleton instance = new Singleton();
    }

    //獲取實例方法
    public static Singleton getInstance(){
        return SingletonInstance.instance;
    }

}

注:code

        在上2例,若是不使用volatile關鍵字,則在多線程狀況下,因爲JMM(Java內存模型)的緣由,可能致使非單例狀況,利用volatile的可見性可解決該問題(JDK1.5及以後).內存

        枚舉類很特殊,在類加載的時候會初始化全部實例,且不會再次被實例化(由JVM保證),也能夠實現單例(不推薦使用).get

        靜態嵌套類與內部類不一樣.class

相關文章
相關標籤/搜索