單例模式(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