執行緒安全的單例模式的幾種實現方法

2021-09-25 18:49:15 字數 1440 閱讀 3679

單例模式分為餓漢模式:在單例類定義時就會進行例項化

* 和懶漢模式:只要到需要用到類的時候才會進行例項化

** 特點:訪問量較少時使用懶漢模式,以時間換空間;訪問量較大時

* 或者訪問的執行緒較多時需要使用餓漢模式,以空間換時間

** 實現單例模式的key point:

* 1、執行緒安全

* 2、建構函式宣告為private 或者 protected防止被外部函式例項化

* 3、內部需要維護乙個 private static的指標

include #include using namespace std;

// 執行緒安全的懶漢模式

// 方法一:使用互斥鎖實現懶漢模式

class singleton1

private:

static singleton1* p1;

public:

static pthread_mutex_t mutex;

static singleton1* instance();

};pthread_mutex_t singleton1::mutex;

singleton1* singleton1::p1 = nullptr;;

singleton1* singleton1::instance()

// 建立完成之後解鎖

pthread_mutex_unlock(&mutex);

}return p1;

}// 方法2:使用內部靜態變數實現懶漢模式

class singleton2

public:

static pthread_mutex_t mutex;

static singleton2* instance();

};pthread_mutex_t singleton2::mutex;

singleton2* singleton2::instance()

// 餓漢模式本身就是執行緒安全的,所以不用加鎖

// 之所以是執行緒安全的是因為在單例類定義之時就已經例項化了乙個物件,並且進行了初始化

// 後面再呼叫instance函式時只會返回乙個類型別的指標

class singleton3

private:

static singleton3* p3;

public:

static singleton3* instance();

};singleton3* singleton3::p3 = new singleton3;

singleton3* singleton3::instance()

總結:餓漢的實現是有隱患的,因為c++中對全域性物件的構造順序並沒有明確的規定。假如有乙個全域性物件a 建構函式裡引用上文中餓漢形式的指標,若在a建構函式構造之前以上單例並未構造出來,那就會有問題。具體在使用時需要視具體情況而定

單例模式幾種安全的實現

單例的應用場景 需要頻繁的建立和銷毀物件的 建立物件時耗時過多或者消耗資源過多但是又經常用到的物件 工具類物件或資料庫或檔案的物件。當物件含有可改變的狀態時 更精確的說就是在實際應用中該狀態會改變 則用多例。一 懶漢式,執行緒安全的實現 public static synchronized sing...

C 實現執行緒安全的單例模式

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

多執行緒單例模式的安全實現

多執行緒單例模式的實現。通過雙重鎖定,自旋處理,實現安全的多執行緒單例和共享區資料的訪問。資源訪問的形式採用簡單等待處理.同時使用std bind進行函式繫結。atomic lock flag p202 6 3 3.cpp 定義控制台應用程式的入口點。include stdafx.h include...