幾種常見單例的寫法和問題

1.爲什麼用單例?

 簡單來說就是全局共享一個對象,如果某對象初始化很麻煩也推薦用單例,只有一個情況下好管理,什麼配置類,Util包一般情況下最好都是單例

2.單例跟static關係

兩者有點像,static從理解是確實是“單例”,但是根本所處JVM區域不同,static只能在靜態方法區,單例對象還可以再堆裏,spring容器常見吧,這不就是一個最好的單例,JVM調優調的也主要是堆,靜態區以後少用。

3.懶漢餓漢

當做一種思維來理解

4.單例實現

一定要保證私有構造,我看網上很多人忘了寫這個,不私有構造,怎麼成單例?

是不是final也無所謂吧,我覺得加跟不加都行。

5.雙層鎖單例的實現

最外層的if是減少可能排隊的線程,貌似不加也行?不加的話可能會有更多的線程阻塞到裏面。

中間那層鎖是阻塞線程用的,目的是讓線程一個一個去創建。

裏面那層實際上比較重要,因爲阻塞的線程可能是多個,沒有這個判斷裏面的線程剛釋放鎖,外面的就立刻又創建一個了造成多次初始化會浪費。

//餓漢式
class SingleA {
    public static SingleA singleA = new SingleA();

    public static SingleA getSingle(){
        return singleA;
    }

    private SingleA() {
    }
}

//懶漢式
class SingleB{
    public static SingleB singleB = null;
    public static synchronized SingleB getSingleB(){
        if(singleB==null){
            singleB=new SingleB();
        }
        return singleB;
    }

    private SingleB() {
    }
}

//靜態內部類
class SingleC{
    public static class SingleCC{
        public static SingleCC singleCC=new SingleCC();
    }

    public static  SingleCC getSingelC(){
        return SingleCC.singleCC;
    }

    private SingleC(){

    }
}

//雙層鎖
class SingleD{
    public static SingleD singleD = null;

    public static SingleD getSingleD(){
        if (singleD==null){
            synchronized ("lock"){
                if (singleD==null){
                    singleD=new SingleD();
                }
            }
        }
        return singleD;
    }

    private SingleD(){

    }
}

class SingleE{
    enum Color{
        Name("顏色");
        private String name;

        public void setName(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }

        Color(String name) {
            this.name = name;
        }
    }

    public static void main(String[] args) {
        
    }
}

 

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