多线程安全的单例代码中,为何要两次判断是否为null

  private static synchronized void syncInit() {
    if (instance == null) {
      instance = new GlobalConfig();
    }
  }

  public static GlobalConfig getInstance() {
    if (instance == null) {
      syncInit();
    }
    return instance;
  }



防止2个线程同时发现instance==null,然后同时调用了syncInit()的同步方法。

这样做,第二个进入syncInit的线程将发现那个对象已经不再是null了
避免被二次初始化。


这是单例模式的多线程必须注意的问题!
快乐渡过每一天,减肥坚持每一天