1、教科書裡的單例模式
我們都很清楚乙個簡單的單例模式該怎樣去實現:建構函式宣告為private或protect防止被外部函式例項化,內部儲存乙個private static的類指標儲存唯一的例項,例項的動作由乙個public的類方法代勞,該方法也返回單例類唯一的例項。
上**:
1
2
3
4
五
6
7
8
9
10
11
12
13
14
15
16
class
singleton
private
:
static
singleton* p;
public
:
static
singleton* instance();
};
singleton* singleton::p = null;
singleton* singleton::instance()
這是乙個很棒的實現,簡單易懂。但這是乙個完美的實現嗎?不!該方法是執行緒不安全的,考慮兩個執行緒同時首次呼叫例項方法且同時檢測到p是null值,則兩個執行緒會同時構造乙個例項給p,這是嚴重的錯誤!同時,這也不是單例的唯一實現!
2懶漢與餓漢
單例大約有兩種實現方法:懶漢與餓漢。
特點與選擇:
3執行緒安全的懶漢實現
執行緒不安全,怎麼辦呢最直觀的方法:加鎖。
一流的此方法也很容易實現,在例項函式裡定義乙個靜態的例項,也可以保證擁有唯一例項,在返回時只需要返回其指標就可以了。推薦這種實現方法,真得非常簡單。單身人士
private
:
static
singleton *
p;public
:
static
pthread_mutex_t mutex;
靜態單例*
initance();
};pthread_mutex_t singleton :: mutex;
singleton
* singleton :: p =
null;
singleton
* singleton :: initance()
返回p;
}
一流的4餓漢實現單身人士
public
:
static
pthread_mutex_t mutex;
靜態單例*
initance();
int
a;};
pthread_mutex_t singleton :: mutex;
singleton
* singleton :: initance()
為什麼我不講「執行緒安全的餓漢實現」?因為餓漢實現本來就是執行緒安全的,不用加鎖。為啥?自己想!
1
2
3
4
五
6
7
8
9
10
11
12
13
14
15
class
singleton
private
:
static
singleton* p;
public
:
static
singleton* initance();
};
singleton* singleton::p =
new
singleton;
singleton* singleton::initance()
是不是特別簡單呢?
以空間換時間,你說簡單不簡單?
面試的時候,執行緒安全的單例模式怎麼寫?肯定怎麼簡單怎麼寫呀!餓漢模式
反而最懶
[正經臉]!
出處:https
:
c 多執行緒單例模式 執行緒安全C 單例模式
我對此處記錄的單例模式有一些疑問 http us library ff650316.aspx 以下 摘自該文章 using system public sealed class singleton private static volatile singleton instance private ...
C 的單例模式與執行緒安全單例模式(懶漢 餓漢)
1 教科書裡的單例模式 我們都很清楚乙個簡單的單例模式該怎樣去實現 建構函式宣告為private或protect防止被外部函式例項化,內部儲存乙個private static的類指標儲存唯一的例項,例項的動作由乙個public的類方法代勞,該方法也返回單例類唯一的例項。上 1 2 3 4 5 6 7...
C 的單例模式與執行緒安全單例模式(懶漢 餓漢)
單例模式 是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例的特殊類。通過單例模式可以保證系統中乙個類只有乙個例項。即乙個類只有乙個物件例項。實現簡單的單例模式 建構函式宣告為private或protect防止被外部函式例項化,內部儲存乙個private static的類指標儲存唯一的例...