《劍指offer》系列--單例模式

永遠年輕,永遠熱淚盈眶。

題目

寫一個單例模式

解析

單例模式有多種寫法,以下整理了六種寫法,你都學會了嗎?

public class Test01 {
    /**
     * 餓漢式
     */
    public static class Singleton1{
        private static final Singleton1 instance = new Singleton1();
        private Singleton1(){}
        public Singleton1 getInstance(){
            return instance;
        }
    }

    /**
     * 懶漢式--非線程安全的
     */
    public static class Singleton2{
        private static Singleton2 instance = null;
        private Singleton2(){}
        public Singleton2 getInstance(){
            if (instance == null){
                instance = new Singleton2();
            }
            return instance;
        }
    }

    /**
     * 懶漢式--線程安全的(效率低,每次都要上鎖)
     */
    public static class Singleton3{
        private static Singleton3 instance = null;
        private Singleton3(){}
        public synchronized Singleton3 getInstance(){
            if (instance == null){
                instance = new Singleton3();
            }
            return instance;
        }
    }

    /**
     * 懶漢式--線程安全的(效率高,推薦使用)
     */
    public static class Singleton4{
        private static Singleton4 instance = null;
        private Singleton4(){}
        public static Singleton4 getInstance(){
            if (instance == null){
                synchronized (Singleton4.class){
                    if (instance == null){
                        instance = new Singleton4();
                    }
                }
            }
            return instance;
        }
    }

    /**
     * 靜態內部類--線程安全(效率高,推薦)
     */
    public static class Singleton5{
        public static class SingletonHolder{
            private static final Singleton5 instance = new Singleton5();
        }
        private Singleton5(){}
        public static Singleton5 getInstance(){
            return SingletonHolder.instance;
        }
    }

    /**
     * 枚舉方式
     */
    public enum Singleton6{
        INSTANCE;
        public void method(){}
    }
}

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