单例模式

三个要素

1、私有的构造方法
2、指向自身的静态实例引用
3、公有的静态的获取自身实例方法

饿汉式


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

懒汉式


public class Singleton{
        private static Singleton singleton;
        private Singleton(){};
        public static Singleton getInstance(){
            if(singleton==null){
                singleton = new Singleton();
            }
            return singleton;
        }
    }

但是以上方式在多线程环境下会出现问题,可能会new出来多个实例。
固需加锁,但是直接在方法上加synchronized关键字,每次获取实例都会加锁,而事实上只需在创建实例的时候才需加锁。故将getInstance方法改成如下:


public static Singleton getInstance() {
        if (singleton== null) {
            synchronized (singleton) {
                if (singleton== null) {
                    singleton= new Singleton();
                }
            }
        }
        return singleton;
    }

当然也可以将创建实例的过程与获取实例的过程分开。

推荐阅读更多精彩内容