前面,我们介绍了两个实现单例模式的方法,但对于前一种,如何在多线程环境下,安全实现单例模式呢?
当说到多线程,我们不难想到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;
}
}
}
注:更多精彩,敬请期待.....