日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

设计模式6---(单例模式的概念及其实现(懒汉式和饿汉式),线程安全)

發(fā)布時(shí)間:2023/11/30 asp.net 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式6---(单例模式的概念及其实现(懒汉式和饿汉式),线程安全) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

單例模式

單例模式的概念

單例模式是一種對(duì)象創(chuàng)建型模式,使用單例模式,可以保證為一個(gè)類只生成唯一的實(shí)例對(duì)象。也就是說,在整個(gè)程序空間中,該類只存在一個(gè)實(shí)例對(duì)象。
GoF 對(duì)單例模式的定義是:保證一個(gè)類、只有一個(gè)實(shí)例存在,同時(shí)提供能對(duì)該實(shí)例加以訪問的全局訪問方法。

為什么適用單例模式

在應(yīng)用系統(tǒng)開發(fā)中,我們常常有以下需求:

  • 在多個(gè)線程之間,比如初始化一次 socket 資源;比如 servlet 環(huán)境,共享同一個(gè)資源或者 操作同一個(gè)對(duì)象
  • 在整個(gè)程序空間使用全局變量,共享資源
  • 大規(guī)模系統(tǒng)中,為了性能的考慮,需要節(jié)省對(duì)象的創(chuàng)建時(shí)間等等。
  • 實(shí)現(xiàn)單例步驟常用步驟

  • 構(gòu)造函數(shù)私有化
  • 提供一個(gè)全局的靜態(tài)方法(全局訪問點(diǎn))
  • 在類中定義一個(gè)靜態(tài)指針,指向本類的變量的靜態(tài)變量指針
  • 懶漢式實(shí)現(xiàn)

    如果單例對(duì)象構(gòu)造十分耗時(shí)或者占用很多資源,比如加載插件啊, 初始化網(wǎng)絡(luò)連接啊,讀取文件啊等等,而有可能該對(duì)象程序運(yùn)行時(shí)不會(huì)用到,那么也要在程序一開始就進(jìn)行初始化,就會(huì)導(dǎo)致程序啟動(dòng)時(shí)非常的緩慢。 所以這種情況使用懶漢模式(延遲加載)更好。

    //懶漢式,需要才創(chuàng)建 class Singleton_lazy{ private:Singleton_lazy(){}//防拷貝Singleton_lazy(Singleton const&);Singleton_lazy & operator=(Singleton const&); public:static Singleton_lazy *getInstace() //提供方法獲取{if(nullptr == pSingleton) //其它線程看到指針不為空,說明已創(chuàng)建,直接用,不需要再等待{m_mtx.lock(); //加鎖保證線程安全if (pSingleton == NULL){pSingleton = new Singleton_lazy;//new有可能失敗,拋出異常造成死鎖}m_mtx.unlock();return pSingleton;}}//內(nèi)嵌垃圾回收類 RAII的思想class Garbo{~Garbo(){if (pSingleton != NULL){delete pSingleton;}}}; private:static Singleton_lazy * pSingleton;//類外初始化好static mutex m_mtx; //互斥鎖 }; //類外初始化 volatile Singleton_lazy * Singleton_lazy::pSingleton = NULL; Singleton_lazy ::CGarbo Garbo; mutex Singleton::m_mtx;

    編譯器有可能進(jìn)行優(yōu)化:指令的重排
    可以加上volatile

    本來的順序
  • 申請(qǐng)空間
  • 構(gòu)造對(duì)象
  • 賦值
  • 優(yōu)化的順序
  • 申請(qǐng)空間
  • 賦值
  • 構(gòu)造對(duì)象
  • 餓漢式實(shí)現(xiàn)

    就是說不管你將來用不用,程序啟動(dòng)時(shí)就創(chuàng)建一個(gè)唯一的實(shí)例對(duì)象。

    //餓漢式,比較著急class Singleton_hungry{private:Singleton_hungry(){}//防止拷貝Singleton_hungry(Singleton const&);Singleton_hungry& operator=(Singleton const&);public:static Singleton_hungry *getInstace(){return pSingleton;}//實(shí)現(xiàn)內(nèi)嵌垃圾回收類#if 0class Garbo{~Garbo(){if (pSingleton != NULL){delete pSingleton;}}};#endifprivate:static Singleton_hungry * pSingleton;};Singleton_hungry * Singleton_hungry::pSingleton = new Singleton_hungry;

    線程安全

  • 餓漢式是線程安全的,在main函數(shù)前創(chuàng)建對(duì)象
  • 懶漢式不是線程安全的
  • 總結(jié)

    以上是生活随笔為你收集整理的设计模式6---(单例模式的概念及其实现(懒汉式和饿汉式),线程安全)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。