单例模式

单例模式指在系统中仅生成一个实例,整个系统中只使用这一个实例,能够减少实例化的操作,即减少系统中new的操作,从而减少内存的使用频率

*单例的模式的核心在于通过一个接口返回唯一的对象实例 首先单例类必须要有一个private构造函数,其次instance成员变量和getInstance()方法必须是static的。 该种方式存在一个缺点,当使用Singleton.doOther(),此时就会实例化Singleton,但是此时并不需要实例化,即无法实现懒加载。如下:

    public class Singleton{
        private Singleton(){
            System.out.println("Singleton is create");
        }

        private static Singleton instance = new Singleton();
        
        public static Singleton getInstance(){
            return instance;
        }

        public static void doOther(){
             System.out.println("do other");
        }
    }
> *以下这种方法能够实现懒加载,即需要实例化时调用getInstance,如果instance不为空,则返回,如果为空则创建后返回。
但该种方法存在另外一种问题,如果两个线程同时调用getInstance,那么会创建两个LazySingleton,违反了单例模式。
    public class LazySingleton{
        private LazySingleton(){
            System.out.println("LazySingleton is creating");
        }
        
        private static LazySingleton instance = null;
        
        public static LazySingleton getInstance(){
            if(null == instance){
                instance = new LazySingleton();
            }
            return instance;
        }
    }
> *通过加同步方法的方式能够解决该问题,即每个线程会进行同步等待锁,这样能够解决线程不安全问题,如下:
    public class LazySingleton{
        private LazySingleton(){
            System.out.println("LazySingleton is creating");
        }
        
        private static LazySingleton instance = null;
        
        public static synchronized LazySingleton getInstance(){
            if(null == instance){
                instance = new LazySingleton();
            }
            return instance;
        }
    }
> *但是带来了极大的性能问题,每个线程都会等待锁,就会耗时很长时间,继而继续优化,大部分instance不为空,这时直接返回不会创建instance,name也就不需要同步,如下:
    public class LazySingleton{
        private LazySingleton(){
            System.out.println("LazySingleton is creating");
        }
        
        private static LazySingleton instance = null;
        
        public static LazySingleton getInstance(){
            if(null == instance){
                synchronized (this){
                    if(null == instance){
                        instance = new LazySingleton();
                    }
                } 
            }
            return instance;
        }
    }