前面,我们介绍了两个实现单例模式的方法,但对于前一种,如何在多线程环境下,安全实现单例模式呢?

当说到多线程,我们不难想到java语言里提供的同步关键字:synchronized

(3)且看代码如下:

public class Singleton {

   public static Singleton single = null;

   //--同样,第一步,先私有化构造方法--

   private Singleton(){}

   //--第二步,提供一个获得该类实例的方法--

   public static synchronized Singleton getInstance(){

     if(null == single){

    single = new Singleton();

}

   return single;

}

}

//--至此,上面的代码,能够实现在多线程下,返回该类的唯一实例。

但是,对于挑剔的朋友,可能会说,当多个线程同时调用 上面的getInstance()方法,要因为同步,而进入到一个等待队列里面去,有没有更好的执行效率的代码?

那么,就是双重加锁了(看了下面代码,你会跟我有同样的疑问:为什么叫“双重加锁”,而不是“双重判断”呢)

(4)且看如下代码:

   public class Singleton{

    public static Singleton single = null;

   //--老生常谈了,第一步,私有化构造方法--

  private Singleton(){}

  //--第二步,提供一个获得该类实例的方法--

public static Singleton getInstance(){

   if(null == single){   //-----第一重判断--

   synchronized( Singleton.class){

   if( null == single ){  //---第二重判断--

     single = new Singleton();

}

}

  return single;

}

}

}

注:更多精彩,敬请期待.....