• 单例模式
    public class Singleton {
      private volatile static Singleton singleton;
      private Singleton() {
      }
      public static Singleton getSingleton() {
          if (singleton == null) {
              synchronized (Singleton.class) {
                  if (singleton == null) {
                      singleton = new Singleton();
                  }
              }
          }
          return singleton;
      }
    }
    ==>为什么要使用双重校验锁?
    第一次判断是为了在已经创建单例对象的情况下。避免进入同步代码块,提升效率;
    在多线程情况下,线程1进入该单例模式,此时单例对象还没有创建,这时线程2获得了时间片,线程2也进入该单例模式,顺利创建了单例对象,所以需要进行二次校验