久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

單例模式

 520jefferson 2015-04-27

 一、懶漢模式:即第一次調(diào)用該類實(shí)例的時(shí)候才產(chǎn)生一個(gè)新的該類實(shí)例,,并在以后僅返回此實(shí)例,。

需要用鎖,來(lái)保證其線程安全性:原因:多個(gè)線程可能進(jìn)入判斷是否已經(jīng)存在實(shí)例的if語(yǔ)句,,從而non thread safety.

使用double-check來(lái)保證thread safety.但是如果處理大量數(shù)據(jù)時(shí),,該鎖才成為嚴(yán)重的性能瓶頸。

1,、靜態(tài)成員實(shí)例的懶漢模式:

  1. <pre name="code" class="cpp">class Singleton  
  2.   {  
  3.   private:  
  4.       static Singleton* m_instance;  
  5.       Singleton(){}  
  6.   public:  
  7.       static Singleton* getInstance();  
  8.   };  
  9.     
  10.  Singleton* Singleton::getInstance()  
  11.  {  
  12.      if(NULL == m_instance)  
  13.      {  
  14.          Lock();//借用其它類來(lái)實(shí)現(xiàn),,如boost  
  15.          if(NULL == m_instance)  
  16.          {  
  17.              m_instance = new Singleton;  
  18.          }  
  19.          UnLock();  
  20.      }  
  21.      return m_instance;  
  22.  }</pre>  

2、內(nèi)部靜態(tài)實(shí)例的懶漢模式

這里需要注意的是,,C++0X以后,,要求編譯器保證內(nèi)部靜態(tài)變量的線程安全性,可以不加鎖,。但C++ 0X以前,,仍需要加鎖。

  1. class SingletonInside  
  2.  {  
  3.   private:  
  4.       SingletonInside(){}  
  5.   public:  
  6.       static SingletonInside* getInstance()  
  7.       {  
  8.           Lock(); // not needed after C++0x  
  9.           static SingletonInside instance;  
  10.          UnLock(); // not needed after C++0x  
  11.          return instance;   
  12.      }  
  13.  };  

二,、餓漢模式:即無(wú)論是否調(diào)用該類的實(shí)例,,在程序開始時(shí)就會(huì)產(chǎn)生一個(gè)該類的實(shí)例,并在以后僅返回此實(shí)例,。

由靜態(tài)初始化實(shí)例保證其線程安全性,,WHY?因?yàn)殪o態(tài)實(shí)例初始化在程序開始時(shí)進(jìn)入主函數(shù)之前就由主線程以單線程方式完成了初始化,,不必?fù)?dān)心多線程問(wèn)題,。

故在性能需求較高時(shí),應(yīng)使用這種模式,,避免頻繁的鎖爭(zhēng)奪,。

  1. class SingletonStatic  
  2.  {  
  3.  private:  
  4.      static const SingletonStatic* m_instance;  
  5.      SingletonStatic(){}  
  6.  public:  
  7.      static SingletonStatic* getInstance()  
  8.      {  
  9.          return m_instance;  
  10.     }  
  11. };  
  12.   
  13. //外部初始化 before invoke main  
  14. const SingletonStatic* SingletonStatic::m_instance = new SingletonStatic;  



m_pInstance指向的空間什么時(shí)候釋放呢?更嚴(yán)重的問(wèn)題是,,該實(shí)例的析構(gòu)函數(shù)什么時(shí)候執(zhí)行,?

如果在類的析構(gòu)行為中有必須的操作,比如關(guān)閉文件,,釋放外部資源,,那么上面的代碼無(wú)法實(shí)現(xiàn)這個(gè)要求。我們需要一種方法,,正常的刪除該實(shí)例,。

可以在程序結(jié)束時(shí)調(diào)用GetInstance(),,并對(duì)返回的指針掉用delete操作,。這樣做可以實(shí)現(xiàn)功能,,但不僅很丑陋,而且容易出錯(cuò),。因?yàn)檫@樣的附加代碼很容易被忘記,,而且也很難保證在delete之后,沒(méi)有代碼再調(diào)用GetInstance函數(shù),。

一個(gè)妥善的方法是讓這個(gè)類自己知道在合適的時(shí)候把自己刪除,,或者說(shuō)把刪除自己的操作掛在操作系統(tǒng)中的某個(gè)合適的點(diǎn)上,使其在恰當(dāng)?shù)臅r(shí)候被自動(dòng)執(zhí)行,。

我們知道,,程序在結(jié)束的時(shí)候,系統(tǒng)會(huì)自動(dòng)析構(gòu)所有的全局變量,。事實(shí)上,,系統(tǒng)也會(huì)析構(gòu)所有的類的靜態(tài)成員變量,就像這些靜態(tài)成員也是全局變量一樣,。利用這個(gè)特征,,我們可以在單例類中定義一個(gè)這樣的靜態(tài)成員變量,而它的唯一工作就是在析構(gòu)函數(shù)中刪除單例類的實(shí)例,。如下面的代碼中的CGarbo類(Garbo意為垃圾工人):

  1. class CSingleton  
  2. {  
  3. //其他成員  
  4. public:  
  5. static CSingleton* GetInstance();  
  6. private:  
  7.     CSingleton(){};  
  8.     static CSingleton * m_pInstance;  
  9. class CGarbo //它的唯一工作就是在析構(gòu)函數(shù)中刪除CSingleton的實(shí)例  
  10. {  
  11.         public:  
  12.             ~CGarbo()  
  13.             {  
  14.                 if( CSingleton::m_pInstance )  
  15.                   delete CSingleton::m_pInstance;  
  16.            }  
  17.  }  
  18.         Static CGabor Garbo; //定義一個(gè)靜態(tài)成員,,程序結(jié)束時(shí),系統(tǒng)會(huì)自動(dòng)調(diào)用它的析構(gòu)函數(shù)  
  19. },;  

類CGarbo被定義為CSingleton的私有內(nèi)嵌類,,以防該類被在其他地方濫用。

程序運(yùn)行結(jié)束時(shí),,系統(tǒng)會(huì)調(diào)用CSingleton的靜態(tài)成員Garbo的析構(gòu)函數(shù),,該析構(gòu)函數(shù)會(huì)刪除單例的唯一實(shí)例。

使用這種方法釋放單例對(duì)象有以下特征:

在單例類內(nèi)部定義專有的嵌套類,;

在單例類內(nèi)定義私有的專門用于釋放的靜態(tài)成員,;

利用程序在結(jié)束時(shí)析構(gòu)全局變量的特性,選擇最終的釋放時(shí)機(jī),;

使用單例的代碼不需要任何操作,,不必關(guān)心對(duì)象的釋放。

具體代碼如下:

  1. #include <iostream>>  
  2.   
  3. using namespace std;  
  4.   
  5. class Singleton  
  6.   
  7. {  
  8.   
  9. public:  
  10.   
  11.     static Singleton *GetInstance();  
  12.   
  13. private:  
  14.   
  15.     Singleton()  
  16.   
  17.     {  
  18.   
  19.         cout << "Singleton ctor" << endl;  
  20.   
  21.     }  
  22.   
  23.     ~Singleton()  
  24.   
  25.     {  
  26.   
  27.         cout << "Singleton dtor" << endl;  
  28.   
  29.     }  
  30.   
  31.     static Singleton *m_pInstance;  
  32.   
  33.     class Garbo  
  34.   
  35.     {  
  36.   
  37.     public:  
  38.   
  39.         ~Garbo()  
  40.   
  41.         {  
  42.   
  43.             if (Singleton::m_pInstance)  
  44.   
  45.             {  
  46.   
  47.                 cout << "Garbo dtor" << endl;  
  48.   
  49.                 delete Singleton::m_pInstance;  
  50.   
  51.             }  
  52.   
  53.         }  
  54.   
  55.     };  
  56.   
  57.     static Garbo garbo;  
  58.   
  59. };  
  60.   
  61. Singleton::Garbo Singleton::garbo;  // 一定要初始化,,不然程序結(jié)束時(shí)不會(huì)析構(gòu)garbo  
  62.   
  63. Singleton *Singleton::m_pInstance = NULL;  
  64.   
  65. Singleton *Singleton::GetInstance()  
  66.   
  67. {  
  68.   
  69.     if (m_pInstance == NULL)  
  70.   
  71.         m_pInstance = new Singleton;  
  72.   
  73.     return m_pInstance;  
  74.   
  75. }  
  76.   
  77. int main()  
  78.   
  79. {  
  80.   
  81.     Singleton *p1 = Singleton::GetInstance();  
  82.   
  83.     Singleton *p2 = Singleton::GetInstance();  
  84.   
  85.     if (p1 == p2)  
  86.   
  87.         cout << "p1 == p2" << endl;  
  88.   
  89.     return 0;  
  90.   
  91. }  


輸出結(jié)果如下:

Singleton ctor

p1 == p2

Garbo dtor

Singleton dtor

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多