内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

三種單例模式的C++實(shí)現(xiàn)-創(chuàng)新互聯(lián)

簡(jiǎn)介

    因?yàn)樵谠O(shè)計(jì)或開(kāi)發(fā)中,肯定會(huì)有這么一種情況,一個(gè)類(lèi)只能有一個(gè)對(duì)象被創(chuàng)建,如果有多個(gè)對(duì)象的話(huà),可能會(huì)導(dǎo)致?tīng)顟B(tài)的混亂和不一致。這種情況下,單例模式是最恰當(dāng)?shù)慕鉀Q辦法。它有很多種實(shí)現(xiàn)方式,各自的特性不相同,使用的情形也不相同。今天要實(shí)現(xiàn)的是常用的三種,分別是餓漢式、懶漢式和多線(xiàn)程式。

為撫順縣等地區(qū)用戶(hù)提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及撫順縣網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都做網(wǎng)站、網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、撫順縣網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專(zhuān)業(yè)、用心的態(tài)度為用戶(hù)提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶(hù)的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!

    通過(guò)單例模式, 可以做到:

1. 確保一個(gè)類(lèi)只有一個(gè)實(shí)例被建立
2. 提供了一個(gè)對(duì)對(duì)象的全局訪(fǎng)問(wèn)指針
3. 在不影響單例類(lèi)的客戶(hù)端的情況下允許將來(lái)有多個(gè)實(shí)例

懶漢式

   懶漢式的特點(diǎn)是延遲加載,比如配置文件,采用懶漢式的方法,顧名思義,懶漢么,很懶的,配置文件的實(shí)例直到用到的時(shí)候才會(huì)加載。。。。。。

class CSingleton { public: static CSingleton* GetInstance() {      if ( m_pInstance == NULL )            m_pInstance = new CSingleton();      return m_pInstance; } private:     CSingleton(){};     static CSingleton * m_pInstance; };

GetInstance()使用懶惰初始化,也就是說(shuō)它的返回值是當(dāng)這個(gè)函數(shù)首次被訪(fǎng)問(wèn)時(shí)被創(chuàng)建的。這是一種防彈設(shè)計(jì)——所有GetInstance()之后的調(diào)用都返回相同實(shí)例的指針:
CSingleton* p1 = CSingleton :: GetInstance();
CSingleton* p2 = p1->GetInstance();
CSingleton & ref = * CSingleton :: GetInstance();
對(duì)GetInstance稍加修改,這個(gè)設(shè)計(jì)模板便可以適用于可變多實(shí)例情況,如一個(gè)類(lèi)允許最多五個(gè)實(shí)例。

代碼很簡(jiǎn)單,但是會(huì)存在內(nèi)存泄漏的問(wèn)題,new出來(lái)的東西始終沒(méi)有釋放,下面是一種餓漢式的一種改進(jìn)。

class CSingleton   {   private:       CSingleton()       {       }       static CSingleton *m_pInstance;       class CGarbo        {       public:           ~CGarbo()           {               if(CSingleton::m_pInstance)                   delete CSingleton::m_pInstance;           }       };       static CGarbo Garbo;    public:       static CSingleton * GetInstance()       {           if(m_pInstance == NULL)               m_pInstance = new CSingleton();           return m_pInstance;       }   };

 在程序運(yùn)行結(jié)束時(shí),系統(tǒng)會(huì)調(diào)用CSingleton的靜態(tài)成員Garbo的析構(gòu)函數(shù),該析構(gòu)函數(shù)會(huì)刪除單例的唯一實(shí)例。使用這種方法釋放單例對(duì)象有以下特征:
1.在單例類(lèi)內(nèi)部定義專(zhuān)有的嵌套類(lèi)。
2.在單例類(lèi)內(nèi)定義私有的專(zhuān)門(mén)用于釋放的靜態(tài)成員。
3.利用程序在結(jié)束時(shí)析構(gòu)全局變量的特性,選擇最終的釋放時(shí)機(jī)。

餓漢式

    餓漢式的特點(diǎn)是一開(kāi)始就加載了,如果說(shuō)懶漢式是“時(shí)間換空間”,那么餓漢式就是“空間換時(shí)間”,因?yàn)橐婚_(kāi)始就創(chuàng)建了實(shí)例,所以每次用到的之后直接返回就好了。

class CSingleton   {   private:       CSingleton()         {       }   public:       static CSingleton * GetInstance()       {           static CSingleton instance;            return &instance;       }   };

   餓漢式是線(xiàn)程安全的,在類(lèi)創(chuàng)建的同時(shí)就已經(jīng)創(chuàng)建好一個(gè)靜態(tài)的對(duì)象供系統(tǒng)使用,以后不再改變,懶漢式如果在創(chuàng)建實(shí)例對(duì)象時(shí)不加上synchronized則會(huì)導(dǎo)致對(duì)對(duì)象的訪(fǎng)問(wèn)不是線(xiàn)程安全的。

注:線(xiàn)程安全的通俗解釋 - 不管多個(gè)線(xiàn)程是怎樣的執(zhí)行順序和優(yōu)先級(jí),或是wait,sleep,join等控制方式,如果一個(gè)類(lèi)在多線(xiàn)程訪(fǎng)問(wèn)下運(yùn)轉(zhuǎn)一切正常,并且訪(fǎng)問(wèn)類(lèi)不需要進(jìn)行額外的同步處理或者協(xié)調(diào),那么我們就認(rèn)為它是線(xiàn)程安全的。 線(xiàn)程安全的類(lèi)應(yīng)當(dāng)封裝了所有必要的同步操作,調(diào)用者無(wú)需額外的同步。還有一點(diǎn):無(wú)狀態(tài)的類(lèi)永遠(yuǎn)是線(xiàn)程安全的。

     在餓漢式的單例類(lèi)中,其實(shí)有兩個(gè)狀態(tài),單例未初始化和單例已經(jīng)初始化。假設(shè)單例還未初始化,有兩個(gè)線(xiàn)程同時(shí)調(diào)用GetInstance方法,這時(shí)執(zhí)行 m_pInstance == NULL 肯定為真,然后兩個(gè)線(xiàn)程都初始化一個(gè)單例,最后得到的指針并不是指向同一個(gè)地方,不滿(mǎn)足單例類(lèi)的定義了,所以餓漢式的寫(xiě)法會(huì)出現(xiàn)線(xiàn)程安全的問(wèn)題!在多線(xiàn)程環(huán)境下,要對(duì)其進(jìn)行修改。

多線(xiàn)程下的單例模式

    這里要處理的是懶漢模式。

class Singleton { private:     static Singleton* m_instance;     Singleton(){} public:     static Singleton* getInstance(); };  Singleton* Singleton::getInstance() {     if(NULL == m_instance)     {         Lock();//借用其它類(lèi)來(lái)實(shí)現(xiàn),如boost         if(NULL == m_instance)         {             m_instance = new Singleton;         }         UnLock();     }     return m_instance; }

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

參考

C++中的單例模式

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線(xiàn),公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。

網(wǎng)站欄目:三種單例模式的C++實(shí)現(xiàn)-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)URL:http://www.rwnh.cn/article4/cojgie.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、面包屑導(dǎo)航、網(wǎng)站改版、外貿(mào)建站、網(wǎng)站制作、虛擬主機(jī)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)
宁波市| 永泰县| 德清县| 万盛区| 香格里拉县| 清新县| 西宁市| 化隆| 陵水| 侯马市| 盖州市| 武邑县| 锡林浩特市| 玛曲县| 来凤县| 清涧县| 榕江县| 信阳市| 马关县| 太谷县| 峨边| 赣榆县| 文化| 茌平县| 柳州市| 池州市| 林甸县| 商河县| 长垣县| 仙游县| 曲靖市| 油尖旺区| 蓝田县| 治县。| 江永县| 苏尼特右旗| 余姚市| 保靖县| 洪雅县| 隆回县| 茶陵县|