singleton模式的一種變體:double-checked locking (轉)

gugu99發表於2008-07-25
singleton模式的一種變體:double-checked locking (轉)[@more@]singleton的一種變體:double-checked locking

在單執行緒下,我們的singleton多半是這樣():
class Singleton{
  private Singleton(){ //... };
  private static Singleton instance = null;
  public static Singleton getInstance
  {
    if ( instance == null )
      instance = new Singleton();
    return instance;
  };
  //...
  }

但是在多執行緒環境下,這裡有個問題:如果一個執行緒先檢查了instance==null,然後開始建立新的例項;同時另一個執行緒又來檢查instance==null(此時第一個執行緒的建立還沒完成),然後也建立新的例項。這樣就有了Singleton類的兩個例項——我們的singleton模式失敗了。

所以我們應該加入同步程式碼。但是加在哪裡呢?如果每個執行緒都需要同步再獲得例項引用,這必然會形成一個瓶頸;如果在instance==null的檢查後面加同步程式碼……這根本沒有用。為什麼?自己想想吧。

我們應該怎麼辦?同步程式碼肯定應該在instance==null的後面,同時,在建立新之前應該再檢查一次instance==null:
class Singleton{
  //...
  private synchronized static void doSync(){
    //在這裡同步
  }
  public Singleton getInstance(){
    if(instance==null){
      Singleton.doSync();
      if(instance==null)  // 再進行一次檢查
        instance = new Singleton();
    }
    return instance;
  }

兩次檢查,既避免了瓶頸,又避免了重複建立。這就是double-checked locking模式。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1007851/,如需轉載,請註明出處,否則將追究法律責任。

相關文章