package com.dding.pmsmigrateServer.web;

public class Singlon {
    /**
     * 1、饿汉模式。直接定义为static final的域。仅在类加载时就定义且赋值。之后只能
     * 通过公开的接口来获取该instance实例。
     *
     * 优点:线程安全。因为在类加载时候就注入了。
     * 缺点:无论使不使用该类。都会去实例话那个唯一的对象。因此造成了内存的无端损耗
     */
    /*private static final Singlon instance = new Singlon();

    private Singlon(){};

    public static Singlon getInstance(){
        return instance;
    }*/

    /**
     * 2、饿汉模式。把instance的初始化放在静态代码块里面。和第一种方法非常相似。优缺点也一样。
     */
    /*private static Singlon instance;//加static保证类唯一
    static{
        instance = new Singlon();
    }
    private Singlon(){

    };
    public static Singlon getInstance(){
        return instance;
    }*/


    /**
     * 3、懒汉模式(线程不安全)
     * 优点:需要用到instance时候再去初始化,不会造成内存的无用消耗
     * 缺点:没有考虑线程安全,如果在多线程的环境下,会出现创建多个instance实例的问题
     */
    /*private static Singlon instance;

    private Singlon(){};

    public static Singlon getInstance(){
        if (null == instance){
            instance = new Singlon();
        }
        return instance;
    }*/

    /**
     * 4、懒汉模式(线程安全)
     * 优点:延迟加载,使用的时候再去初始化instance。且加了锁保证同一时间只有一个线程能去调用
     * getInstance()方法。保证多线程情况下的安全性
     * 缺点:多线程环境下效率太低了。每一次去获取实例时都要做加锁,也就是同步处理。就会造成线程阻塞。
     * 原本初始化instance只有一次。但是这么写导致了每次都要去加锁,判断有没有锁。不好
     */
    /*private static Singlon instance;

    private Singlon(){};

    public synchronized static Singlon getInstance(){
        if (null == instance){
            instance = new Singlon();
        }
        return instance;
    }*/

    /**
     * 5、懒汉模式(改良版线程安全)
     * 优点:延迟加载,保证线程安全性。且只在初始化instance的时候加锁。也就是只在第一次初始化的时候加锁来
     * 保证安全。之后的多线程获取实例,都不需要进行同步处理。极大的提高了效率
     */
    /*private static Singlon instance;

    private Singlon(){};

    public static Singlon getInstance(){
        if (null == instance){
            synchronized (Singlon.class){
                if (null == instance){
                    instance = new Singlon();
                }
            }
        }
        return instance;
    }*/

    /**
     * 6、枚举类型
     */

    /**
     * 使用枚举的单例模式
     * jvm保证enum不能被反射并且构造器方法只执行一次。
     */
    /*public class EnumSingleton{
        private EnumSingleton(){}
        public static EnumSingleton getInstance(){
            return Singleton.INSTANCE.getInstance();
        }

        private static enum Singleton{
            INSTANCE;

            private EnumSingleton singleton;
            //JVM会保证此方法绝对只调用一次
            private Singleton(){
                singleton = new EnumSingleton();
            }
            public EnumSingleton getInstance(){
                return singleton;
            }
        }
    }*/
}