知識點12:單例模式的實現

單例模式是比較容易在面試中出現的問題,一般要求是手寫代碼,比如我就試過了。。所以一定要打起十二分精神,要了解線程安全的、效率高的單例模式怎麼實現。下面是幾個代碼,分別是從不好的到好的逐漸遞進,這樣才能靈活面對面試官的下一步發問。好了,話不多說,直接上代碼:
實現一:

public class Singletop1 {
    /*
     * SingleTop的解法1:
     * 推薦指數:***
     * 原因:只支持單線程環境
     * */
    private static Singletop1 instance = null;

    public static Singletop1 getSingletop1(){
        if (instance == null) {
            instance = new Singletop1();
        }
        //打印測試用例,可刪除
        System.out.println(instance.hashCode());
        return instance;
    }
}

實現二:

public class SingleTop2 {
    /*
     * SingleTop的解法2:
     * 推薦指數:***
     * 原因:雖然在多線程環境中可以實現,但效率不高
     * */
    private static SingleTop2 instance2 = null;

    public static synchronized SingleTop2 getSingleTop2(){
        if (instance2 == null) {
            instance2 = new SingleTop2();
        }
        //打印測試用例,可刪除
        System.out.println(instance2.hashCode());
        return instance2;
    }
}

實現三:

public class SingleTop3 {
    /*
     * SingleTop的解法3:
     * 推薦指數:****
     * 原因:適合多線程,效率可行,但結構複雜,不易理解
     * */
    private static Object synObject = new Object();
    private static SingleTop3 instance3 = null;

    public static SingleTop3 getSingleTop3(){
        if (instance3 == null) {
            synchronized (synObject) {
                if (instance3 == null) {
                    instance3 = new SingleTop3();
                }
            }
        }
        //打印測試用例,可刪除
        System.out.println(instance3.hashCode());
        return instance3;
    }
}

實現四:

public class SingleTop4 {
    /*
     * SingleTop的解法4:
     * 推薦指數:****
     * 原因:線程安全,簡潔,但效率同樣較低,調用靜態構造函數的時機不由程序員掌控
     * */
    private static final SingleTop4 instance4 = new SingleTop4();

    public static SingleTop4 getSingleTop4(){
        //打印測試用例,可刪除
        System.out.println(instance4.hashCode());
        return instance4;
    }
}

實現五:

public class SingleTop5 {
    /*
     * SingleTop的解法5:
     * 推薦指數:*****
     * 原因:利用嵌套類型的特性,做到只有在真正需要的時候才創建實例,既線程安全,又節省資源
     * */
    public static SingleTop5 getSingleTop5(){
        //打印測試用例,可刪除
        System.out.println(Nested.instance5.hashCode());
        return Nested.instance5;
    }

    private static class Nested{
        private static SingleTop5 instance5 = new SingleTop5(); 
    }
}

如果你認真看了一遍以上五種實現方式,是否發現他們都是爲了解決前面某種不足而被開發出來的呢?這就是一種遞進性的理解。如果你從第一個實現方式開始看起,知道第五個實現方式也掌握了的話,那你對單例模式的理解也就到火候了。當然,實現單例模式並不止這五種方法,還有其他的形式,比如利用枚舉也可以實現。因此,如果想要理解多一點的話,也可以上csdn找一下相關的博客,總不會讓你失望的。
好了,這期博客到此結束,再見:
如有疑問,歡迎下方評論指出,共同進步

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