前面,我們介紹了兩個實現單例模式的方法,但對於前一種,如何在多線程環境下,安全實現單例模式呢?
當說到多線程,我們不難想到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;
}
}
}
注:更多精彩,敬請期待.....