1、單例模式:
單例模式:用來建立獨一無二的,只能夠有乙個例項的物件。 單例模式的結構是設計模式中最簡單的,但是想要完全實現乙個執行緒安全的單例模式還是有很多陷阱的。
2、應用場景:
共享資料或者共享訪問點;
建立乙個物件需要消耗的資源過多,如訪問io和資料庫等資源;
需要定義大量的靜態常量和靜態方法(工具類)
單例模式的應用場景:有一些物件其實只需要乙個,比如:windows task manager (任務管理器)、windows **站、執行緒池、快取、對話方塊、處理偏好設定和登錄檔的物件、日誌物件、充當印表機、顯示卡等裝置的驅動程式物件。這些物件只能夠擁有乙個例項,如果建立出了多個例項,就會導致一些程式的問題。程式的行為異常,資源使用的過量,或者導致不一致的結果。常用來管理共享的資源,比如資料庫的連線或者執行緒池。
3、優缺點:
優點:乙個例項,減少記憶體開銷;減少系統開銷;避免對乙個資源的多重占用;設定全域性訪問點,優化和貢獻資源。
缺點:沒有藉口,擴充套件性差;不利於測試;與單一職責原則有衝突,單例模式把「要單例」和業務邏輯融合在乙個類中。
4、實現
1、經典實現(執行緒不安全)
1class
singleton 2
7private: 8
static singleton *p; 9};
1011 singleton* singleton::p =null;
12 singleton*singleton::getinstance()
13
11、當兩個執行緒執行至if(instance==null)時,可能產生執行緒安全問題。23
改進:在用到的時候在初始化,這樣程式效率比較高,但是有乙個另外比較好的方法可以採用是提前初始化,將instance設定為static之後直接初始化為singleton物件,每次只需要執行返回操作即可。45
class
singleton ;
1617
//對單例直接進行初始化,而不再方法instance中進行判斷。
1819 singleton* singleton::instance = new
singleton;
2021 singleton*singleton::getinstance()
2223
28 這樣的話同樣會導致問題,就是如果單例本來資源比較多,但是不需要建立那麼早,就會消耗資源~
2930
2、另外一種提公升因為同步導致的效能變差的方法稱為「雙重檢驗加鎖」。方法如下:
3132
class
singleton
4041 singleton *singleton::instance =null;
42 singleton*singleton::getinstance()
50unlock();51}
52return
_instance;53}
5455 思路是只有在第一次建立的時候進行加鎖,當instance不為空的時候就不需要進行加鎖的操作,這樣就可以提公升效能~
2、懶漢模式與餓漢模式
懶漢:故名思義,不到萬不得已就不會去例項化類,也就是說在第一次用到類例項的時候才會去例項化,所以上邊的經典方法被歸為懶漢實現;
餓漢:餓了肯定要飢不擇食。所以在單例類定義的時候就進行例項化。
特點與選擇
區別:由於要進行執行緒同步,所以在訪問量比較大,或者可能訪問的執行緒比較多時,採用餓漢實現,可以實現更好的效能。這是以空間換時間。在訪問量較小時,採用懶漢實現。這是以時間換空間。
11.加鎖實現執行緒安全的懶漢模式23
class
singleton 4
13private
: 14
static singleton*p;
15};
1617
pthread_mutex_t singleton::mutex;
18 singleton* singleton::p =null;
19 singleton*singleton::getinstance() 20
28return
p; 29}30
312.內部靜態變數實現懶漢模式
3233
class
singleton 34
43};
4445
pthread_mutex_t singleton::mutex;
46 singleton*singleton::getinstance()
47
1餓漢模式23
class
singleton 4
9private
: 10
static singleton*p;
11};
1213 singleton* singleton::p = new
singleton;
14 singleton*singleton::getinstance()
15
C 單例模式
include using namespace std 單例類的c 實現 class singleton 構造方法實現 singleton singleton void singleton setvar int var main int main int argc,char argv return ...
C 單例模式
實現方式一 include template typename t class singleton boost noncopyable static void init private static pthread once t ponce statict value template typena...
C 單例模式
效率有點低,但是還算安全的單例模式,靜態成員實現方式 class singleton public static singleton getinstance singleton singleton getinstance unlock return m instance 內部靜態例項的懶漢模式,c ...