1. 程式人生 > >單例模式(C++實現)

單例模式(C++實現)

1. 單例模式 (C++實現)

單例模式:保證一個類只有一個物件例項,並提供一個訪問該物件例項的全域性訪問點。

單例模式有兩種實現方法:懶漢模式和餓漢模式。

1.1 懶漢模式

懶漢模式:故名思義,不到萬不得已就不會去例項化類,也就是說在第一次用到類例項時候才會去例項化它。

在訪問量較小時,採用懶漢模式,這裡是以時間換空間。

執行緒安全的懶漢實現:

Singleton.cpp

#include <iostream>
#include <pthread.h>
#include <unistd.h>

using namespace std;

class Singleton
; class Singleton { private: static Singleton *gInstance; static pthread_mutex_t g_tMutex; public: static Singleton *getInstance() { if (NULL == gInstance)//雙重鎖定,提高多執行緒效能 { pthread_mutex_lock(&g_tMutex); if (NULL == gInstance) gInstance = new Singleton; pthread_mutex_unlock
(&g_tMutex); } return gInstance; } void printInfo(){ cout<<"This is singleton"<<endl; } private: Singleton() { cout<<"Singleton()"<<endl; } }; /* 懶漢模式 */ Singleton *Singleton::gInstance; pthread_mutex_t Singleton::g_tMutex = PTHREAD_MUTEX_INITIALIZER; /* ------------------------------- for test --------------------------------------- */
void *start_routine_thread1(void *arg) { cout<<"this is thread 1 ..."<<endl; Singleton *s = Singleton::getInstance(); s->printInfo(); return NULL; } void *start_routine_thread2(void *arg) { cout<<"this is thread 2 ..."<<endl; Singleton *s = Singleton::getInstance(); s->printInfo(); return NULL; } int main() { Singleton *s = Singleton::getInstance(); s->printInfo(); Singleton *s2 = Singleton::getInstance(); s2->printInfo(); Singleton *s3 = Singleton::getInstance(); s3->printInfo(); /* 建立執行緒,線上程裡也去呼叫Singleton::getInstance */ pthread_t thread1ID; pthread_t thread2ID; pthread_create(&thread1ID, NULL, start_routine_thread1, NULL); pthread_create(&thread2ID, NULL, start_routine_thread2, NULL); sleep(3); return 0; }

測試:

$ g++ Singleton.cpp -pthread
$ ./a.out
Singleton()
This is singleton
This is singleton
This is singleton
this is thread 1 ...
This is singleton
this is thread 2 ...
This is singleton

1.2 餓漢模式

餓漢模式:餓了肯定要飢不擇食,所以在單例類定義的時候就進行例項化。

在訪問的執行緒比較多時,採用餓漢模式,可以實現更好的效能,這裡是以空間換時間。餓漢模式執行緒是安全的,因為一開始已經對單例類進行的例項化。

餓漢模式的實現:

Singleton2.cpp


#include <iostream>
#include <pthread.h>
#include <unistd.h>

using namespace std;

class Singleton;

class Singleton {

private:
	static Singleton *gInstance;

public:
	static Singleton *getInstance()
	{
		return gInstance;
	}

	void printInfo(){ cout<<"This is singleton"<<endl; }

private:
	Singleton()
	{
		cout<<"Singleton()"<<endl;
	}

};

/* 餓漢模式 */
Singleton *Singleton::gInstance = new Singleton;

/* ------------------------------- for test --------------------------------------- */
void *start_routine_thread1(void *arg)
{
	cout<<"this is thread 1 ..."<<endl;

	Singleton *s = Singleton::getInstance();
	s->printInfo();	

	return NULL;
}

void *start_routine_thread2(void *arg)
{
	cout<<"this is thread 2 ..."<<endl;

	Singleton *s = Singleton::getInstance();
	s->printInfo();	

	return NULL;
}

int main()
{
	Singleton *s = Singleton::getInstance();
	s->printInfo();	

	Singleton *s2 = Singleton::getInstance();
	s2->printInfo();

	Singleton *s3 = Singleton::getInstance();
	s3->printInfo();

	/* 建立執行緒,線上程裡也去呼叫Singleton::getInstance */
	pthread_t thread1ID;
	pthread_t thread2ID;

	pthread_create(&thread1ID, NULL, start_routine_thread1, NULL);
	pthread_create(&thread2ID, NULL, start_routine_thread2, NULL);

	sleep(3);

	return 0;
}

除錯:

$ g++ Singleton2.cpp -pthread
$ ./a.out
Singleton()
This is singleton
This is singleton
This is singleton
this is thread 1 ...
this is thread 2 ...
This is singleton
This is singleton

相關推薦

01:模式——C++實現

目錄 一、介紹 二、應用場景 三、要點 四、樣例Demo 4.1、區域性靜態變數 4.2、懶漢式與餓漢式 懶漢式 餓漢式  4.3、執行緒安全  4.4、資源釋放  五、優缺點 優點 缺點: 一、介紹

設計模式-模式-C++實現

單例模式:保證一個類提供且僅提供一例項,並提供一個訪問它的全域性訪問點。 場景: 1.當類只能有一個例項並且客戶可以從一個公共的介面訪問到例項; 2.當這個唯一的例項應該是通過子類化可擴充套件的,並且客戶應該無需更改程式碼就能使用一個擴充套件的例項。 #include <s

模式(C++實現)

1. 單例模式 (C++實現) 單例模式:保證一個類只有一個物件例項,並提供一個訪問該物件例項的全域性訪問點。 單例模式有兩種實現方法:懶漢模式和餓漢模式。 1.1 懶漢模式 懶漢模式:故名思義,不到萬不得已就不會去例項化類,也就是說在第一次用到類例項時候才會

模式——C++實現執行緒安全的

一、懶漢模式:即第一次呼叫該類例項的時候才產生一個新的該類例項,並在以後僅返回此例項。 需要用鎖,來保證其執行緒安全性:原因:多個執行緒可能進入判斷是否已經存在例項的if語句,從而non thread safety. 使用double-check來保證thread s

模式c++實現方法總結

一  單例模式介紹 單例模式約束了類的例項化,只允許類建立一個物件。 在用程式碼實現單例模式之前,先看看單例模式的類結構:   特點: 1.  類的建構函式外界不可訪問. 2.  提供了建立物件的介面.  二  單例模式C++實現 1.   實現方法一(只作為樣例,不推薦

設計模式——模式C++實現

引出問題: 設計一個類,我們只能生成該類的一個物件例項。 不好的解法:只適用於單執行緒環境 因為該類只能生成一個物件例項,那麼該類的建構函式必須是私有的,從而避免他人建立例項。在需要的時候建立該類的一個物件。 下面是程式實現: /****************

設計模式之“模式C++/python實現

       單例模式用來只允許建立一個例項的類,比如一個系統中只能有一個工作管理員,對於單伺服器多客戶端系統,伺服器也應該設為單例的。        對於C++單例模式需要滿足以下三點:        1)單例模式的類只提供私有的建構函式;        2)是類定義

C# 模式實現

單例模式讓一個類僅有一個例項,並提供訪問它的全域性訪問點。單例模式的實現通常如下: public class Singleton { private static Singleton singleton; private Singleton()

C++單體類 || 模式實現

單件模式是設計模式中最簡單的模式了。     定義: 確保一個類只有一個例項,並提供一個全域性的訪問點。 把一個類設計成自己管理的一個單獨例項,同時避免其他類再自行生成例項(所以建構函式用protect或privite) 也提供全域性的訪問點。public函式 一、

設計模式模式 (C++ 懶漢經典實現 & DCL實現 & 餓漢經典實現)

顧名思義: 單例模式,指的是僅有一個(類)例項。 即: 在應用程式的整個生命週期中,任何時刻,某個類(單例類)僅存在唯一一個例項。 同時僅提供一個全域性訪問點。 單例的實現一般要求滿足: (1) 類建構函式私有 (2) 提供一個全域性訪問點 一般是靜態的共有方法 一、單

劍指offer:面試題二:模式實現(使用C++語言)

#include <iostream> #include <iomanip> #include <cstdio> #include <cstdlib>

C# 執行緒和多執行緒下的模式實現

該單例模式是執行緒不安全的,只能在單執行緒下執行,在多執行緒中如果被兩個執行緒同時呼叫Instance屬性時,此時兩個執行緒判斷 if (_instance==null)時都會返回true,就會建立兩個例項。public class Singleton{ /// <

Objective-C 中singleton(模式)的實現

OC中的單例很有意思,因為沒辦法像JAVA或C++中把建構函式設為private的來防止其它人直接 new 一個新物件,所以像如下單例的實現方式,只能祈禱大家必須按你要求的方式建立物件,有人不小心直接 [[ xx alloc] init] 建立一個物件,是很難發現的。 s

設計模式——模式(C++)

clu win 安全 iostream public size turn instance stat 一: 餓漢式單例: 靜態區初始化instance,然後通過getInstance返回。這種方式沒有多線程的問題,是一種以空間換時間的方式,不管程序用不用,都會構造唯一的

scala 基礎十二 scala apply的使用,工廠方法和模式實現

定義 其他 返回 pack 新的 true 伴生對象 args null 1. apply 可以用來實現類似於靜態的初始化類的實例,請看下面實例 package smart.iot class applyclass { } class A {

設計模式模式 Singleton實現

-- throw return null mage demo1 nbsp 定義 所在 餓漢式 餓漢式單例模式,static變量會在類裝載時初始化,此時也不會涉及多個線程對象訪問該對象的問題。虛擬機保證只會裝載一次該類,肯定不會發生並發訪問的問題,

Java模式 多種實現方式

main 概念 ron system sta ava 實現 args == 一:通過靜態私有成員實現單例模式 (1):私有化構造函數 (2):new靜態實例屬性對象,加鎖。 單例類: package SinglePag; /* * 構造函數私有化,結合鎖+靜態的概念 實

模式實現(餓漢式和懶漢式)

null cte get pri single singleton ins 安全 tin 1.懶漢模式。 class Singleton { private: static Singleton* m_instance; Singleton(

模式(C#)

技術分享 pen com write 今天 ins pan .cn 控制臺 學習設計模式,一直沒有機會寫一個單例模式。今天在控制臺應用程序,寫個簡單的例子,Hi與Hello。 public sealed class At {

Python設計模式模式實現及在Tornado中的應用

實例 類變量 attribute rap all wrap 線程 ++ 出現 單例模式的實現方式 將類實例綁定到類變量上 class Singleton(object): _instance = None def new(cls, *args): if not isinst