我也來湊熱鬧--單例模式(2)

前面,我們介紹了兩個實現單例模式的方法,但對於前一種,如何在多線程環境下,安全實現單例模式呢?

當說到多線程,我們不難想到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;

}

}

}

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章