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());
    }
}

猜你喜欢

转载自blog.csdn.net/ma451152002/article/details/83117699