單例模式加鎖與不加鎖例項C

2021-07-31 02:56:06 字數 2657 閱讀 5285

1 教科書裡的單例模式

我們都很清楚乙個簡單的單例模式該怎樣去實現:建構函式宣告為private或protect防止被外部函式例項化,內部儲存乙個private static的類指標儲存唯一的例項,例項的動作由乙個public的類方法代勞,該方法也返回單例類唯一的例項。

上**:  ?

12

3

4

5

6

7

8

9

10

11

12

13

14

15

16

classsingleton

private:

staticsingleton* p;

public:

staticsingleton* instance();

};

singleton* singleton::p = null;

singleton* singleton::instance()

這是乙個很棒的實現,簡單易懂。但這是乙個完美的實現嗎?不!該方法是執行緒不安全的,考慮兩個執行緒同時首次呼叫instance方法且同時檢測到p是null值,則兩個執行緒會同時構造乙個例項給p,這是嚴重的錯誤!同時,這也不是單例的唯一實現!

2 懶漢與餓漢

單例大約有兩種實現方法:懶漢與餓漢。

特點與選擇:

3 執行緒安全的懶漢實現

執行緒不安全,怎麼辦呢?最直觀的方法:加鎖。

class

singleton

private

:

static singleton*p;

public

:

static

pthread_mutex_t mutex;

static singleton*initance();

};pthread_mutex_t singleton::mutex;

singleton* singleton::p =null;

singleton*singleton::initance()

return

p;}

此方法也很容易實現,在instance函式裡定義乙個靜態的例項,也可以保證擁有唯一例項,在返回時只需要返回其指標就可以了。推薦這種實現方法,真得非常簡單。

class

singleton

public

:

static

pthread_mutex_t mutex;

static singleton*initance();

inta;

};pthread_mutex_t singleton::mutex;

singleton*singleton::initance()

4 餓漢實現

為什麼我不講「執行緒安全的餓漢實現」?因為餓漢實現本來就是執行緒安全的,不用加鎖。為啥?自己想!?

12

3

4

5

6

7

8

9

10

11

12

13

14

15

classsingleton

private:

staticsingleton* p;

public:

staticsingleton* initance();

};

singleton* singleton::p =newsingleton;

singleton* singleton::initance()

是不是特別簡單呢?

以空間換時間,你說簡單不簡單?

面試的時候,執行緒安全的單例模式怎麼寫?肯定怎麼簡單怎麼寫呀!餓漢模式反而最懶[正經臉]! 

單例模式加鎖優化問題

單例模式特點 單例模式應用場景 單例模式型別 優點 一開始就建立例項,執行緒安全 缺點 佔記憶體,耗資源 public class singleton 建立公有靜態例項 public static singleton getinstance 優點 呼叫例項靜態方法時,沒有建立例項,再建立 合理利用資...

單例模式多執行緒 加鎖

單例模式的多執行緒 比如使用者點選 程式正在操作這條資料的過程中 然後又有乙個人點選 又把這條資料修改了 多執行緒會發生的問題 這時候 當第乙個使用者點選後 應該給這個方法上鎖 通常new乙個object物件 把執行的 放到lock中 lock裡面的方法塊只有乙個執行緒可以進入 第二個執行緒需要等待...

研磨設計模式 單例模式 雙重檢查加鎖

雙重檢查加鎖 雙重檢查加鎖 的方式可以既實現執行緒安全,又能夠使效能不受到很大的影響。那麼什麼是 雙重檢查加鎖 機制呢?所謂雙重檢查加鎖機制,指的是 並不是每次進入getinstance方法都需要同步,而是先不同步,進入方法過後,先檢查例項是否存在,如果不存在才進入下面的同步塊,這是第一重檢查。進入...