設計模式 單例模式

2022-08-27 23:54:13 字數 1971 閱讀 4811

一、單例

1.  內部變數使用規則:

關於多個執行緒同時呼叫單例模式的物件,該物件中方法的區域性變數是否會受多個執行緒的影響

對於成員變數的操作,可以使用threadlocal來保證執行緒安全。

區域性變數不會受多執行緒影響

成員變數會受到多執行緒影響

多個執行緒應該是呼叫的同乙個物件的同乙個方法:

如果方法裡無成員變數,那麼不受任何影響

如果方法裡有成員變數,只有讀操作,不受影響

存在寫操作,考慮多執行緒影響值

2. 單例的分類:

2.1、懶漢模式:即第一次呼叫該類例項的時候才產生乙個新的該類例項,並在以後僅返回此例項。

需要用鎖,來保證其執行緒安全性:原因:多個執行緒可能進入判斷是否已經存在例項的if語句,從而non thread safety.

使用double-check來保證thread safety.但是如果處理大量資料時,該鎖才成為嚴重的效能瓶頸。

1)靜態成員例項的懶漢模式:

class singleton

private:

static singleton* m_instance;

singleton(){}

public:

static singleton* getinstance();

singleton* singleton::getinstance()

if(null == m_instance)

lock();//借用其它類來實現,如boost

if(null == m_instance)

m_instance = new singleton;

unlock();

return m_instance;

進一步優化版:

singleton* singleton::getinstance()

if(null == m_instance)

lock();//借用其它類來實現,如boost

if(null == m_instance)

singleton *tmp  = new singleton;

m_instance = tmp;

unlock();

return m_instance;

此處的優化是為了保證構造未完成時,有其他執行緒呼叫該單例;

2)內部靜態例項的懶漢模式

class singletoninside

private:

singletoninside(){}

public:

static singletoninside* getinstance()

lock(); // not needed after c++0x

static singletoninside instance;

unlock(); // not needed after c++0x

return instance;

二、餓漢模式:即無論是否呼叫該類的例項,在程式開始時就會產生乙個該類的例項,並在以後僅返回此例項。

由靜態初始化例項保證其執行緒安全性,why?因為靜態例項初始化在程式開始時進入主函式之前就由主線程以單執行緒方式完成了初始化,不必擔心多執行緒問題。

故在效能需求較高時,應使用這種模式,避免頻繁的鎖爭奪。

class singletonstatic

private:

static const singletonstatic* m_instance;

singletonstatic(){}

public:

static const singletonstatic* getinstance()

return m_instance;

//外部初始化 before invoke main

const singletonstatic* singletonstatic::m_instance = new singletonstatic;

設計模式 單例模式

單例模式 singleton pattern 是乙個比較簡單的模式,其定義如下 ensure a class has only one instance,and provide a golbal point of acess to it.確保某乙個類只有乙個例項,而且自行例項化並且向整個系統提供這個...

設計模式 單例模式

class testsingleton static public function instance return self testsingleton private function clone public function setsinvar sinvar public function ...

設計模式 單例模式

單例模式的目的是保證類在系統中只被例項化一次,由該唯一的例項來為系統提供服務.單例模式主要用於保證服務的統一,比如獲取統一的編號服務,模仿oracle的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...