饿汉式单例:
    在该类中的一个成员变量创建了一个自己的实例,不会存在线程安全问题

    懒汉式单例:
    在需要用到的时候才会创建,创建的时候有可能多个线程同时操作造成非单例的情况,情况如下
    1、使用同步代码块或者同步方法:在尚未存在单例对象时,创建一个,存在说在线程等待的时候已经进入了同步方法或者同步块,因此等第一个线程执行完之后第二个线程依然能够进行创建,这样就破坏了单例的原则
    2、对于上面的解决方式进行优化,在首次判断单例对象是否为空之后进入同步方法或者同步代码块,在该地方再次检查是否已经存在单例对象,然后再进行创建,但是依然会出现问题:假设我第一个线程创建了单例对象之后并没有将地址赋予给变量,那么第二个线程执行的时候还是找不到,甚至感觉不到已经创建了一个单例对象
    3、针对上面这种情况,再次优化的方案是将接收创建的单例对象地址的变量用volatile修饰,这个关键字有2个作用,一:保证变量在内存的可见性
    二:避免发生指令重排序(先开辟内存,创建变量,变量赋值内存地址)