1. 程式人生 > >Java單例模式實現的幾種方法

Java單例模式實現的幾種方法

package offer;

public class Test02 {

    /**
     * 01 餓漢模式  執行緒安全
     */
    public static class Singleton{
        private final static Singleton INSTANCE = new Singleton();

        private Singleton (){}

        public static Singleton getInstance(){
            return INSTANCE;
        }
    }

    /**
     * 02  懶漢模式  非執行緒安全
     */
    public static class Singleton2{
        private static Singleton2 instance = null;

        private Singleton2(){

        }

        public static Singleton2 getInstance(){
            if (null == instance ){
                instance = new Singleton2();//非執行緒安全
            }
            return instance;
        }

    }

    /**
     * 03 懶漢模式  執行緒安全 使用synchromized關鍵字修飾 效率低
     */
    public static class Singleton3{
        private  static Singleton3 instance = null;
        private Singleton3(){}
        public static synchronized Singleton3 getInstance (){
            if (null == instance){
                instance = new Singleton3();
            }
            return instance;
        }
    }

    /**
     * 04 餓漢模式 執行緒安全  使用靜態程式碼塊 注意static的順序
     */
    public static class Singleton4 {
        private static Singleton4 instance = null;
        static {
            instance = new Singleton4();
        }

        private Singleton4(){

        }

        public static Singleton4 getInstance(){
            return instance;
        }
    }

    /**
     * 05 靜態內部類方式
     */
    public static class Singleton5{
        private final static class SingletonHolder{
            private static final Singleton5 INSTANCE = new Singleton5();
        }

        private Singleton5(){}

        public static Singleton5 getInstance(){
            return SingletonHolder.INSTANCE;
        }
    }

    /**
     * 06 列舉形式1
     */
    public enum Singleton6{
        INSTANCE;
        public void anyMethod(){

        }
    }

    /**
     * 07  列舉形式2  推薦
     */
    public static class EnumSingleton{
        private EnumSingleton(){}

        public static EnumSingleton getInstance(){
            return Singleton.INSTANCE.getInstance();
        }

        private static enum Singleton{
            INSTANCE;

            private EnumSingleton singleton;

            private Singleton(){
                singleton = new EnumSingleton();
            }

            public EnumSingleton getInstance(){
                return singleton;
            }
        }

    }

    /**
     * 07 懶漢模式 執行緒安全 雙重檢驗
     */
    public static class Singleton7{
        //使用volatile防止程式碼重排序,讀到未初始化完成的instance物件
        private volatile static Singleton7 instance = null;

        private Singleton7(){

        }

        public static Singleton7 getInstance(){
            if(null == instance){
                synchronized(Singleton7.class){//區域性使用同步方法,提高效率
                    instance = new Singleton7();
                }
            }
            return instance;
        }

    }

    // test
    public static void main(String[] args){
        System.out.println(Singleton.getInstance()== Singleton.getInstance());
        System.out.println(Singleton2.getInstance() == Singleton2.getInstance());
        System.out.println(Singleton3.getInstance() == Singleton3.getInstance());
        System.out.println(Singleton4.getInstance() == Singleton4.getInstance());
        System.out.println(Singleton5.getInstance() ==  Singleton5.getInstance());
        System.out.println(Singleton6.INSTANCE == Singleton6.INSTANCE);
        System.out.println(EnumSingleton.getInstance() == EnumSingleton.getInstance());
        System.out.println(Singleton7.getInstance() == Singleton7.getInstance());
    }
}