C++用多種方式實現Singleton單例模式
題目:設計一個類,只能生成該類的一個例項。
(1)解法一:只適用於單執行緒環境
由於要求只能生成一個例項,因此我們必須把建構函式設為私有函式以禁止他人建立例項。我們可以定義一個靜態的例項,在需要的時候建立該例項。
public class Singleton1{
private Singleton1(){
}
private static Singleton1 instance = NULL;
public static Singleton1 funcInstance{
get{
if(instance == NULL){
instance = new Singleton1();
}
return instance;
}
}
}
上述程式碼在Singleton1的靜態方法funcInstance()中,只有在instance為null的時候才建立一個例項以避免重複建立,同時把建構函式定義為私有函式,這樣才能確保只建立一個例項。
(2)解法二:雖然能在多執行緒環境中能工作但是效率不高
解法一中的程式碼在單執行緒的時候工作正常,但是在多執行緒的情況下就有問題了。假設兩個執行緒同時執行到判斷instance是否為null的if語句,並且instance的確沒有建立時,那麼兩個執行緒都會建立一個例項,此時就不再滿足單例模式的要求了。
為了保證在多執行緒環境下我們還是隻能得到型別的一個例項,需要加上一個同步鎖。實現如下:
public class Singleton2{
private Singleton2(){
}
private static readonly object syncObj = new object();
private static Singleton2 instance = NULL;
public static Singleton2 funcInstance{
get{
lock(sync){
if(instance == NULL){
instance = new Singleton2();
}
}
return instance;
}
}
}
我們還是假設有兩個執行緒同時想建立一個例項。由於在一個時刻只有一個執行緒能得到同步鎖,當第一個執行緒加上鎖時,第二個執行緒只能等待。當第一個執行緒發現例項還沒有建立時,他建立出一個例項。接著第一個執行緒釋放同步鎖,此時第二個執行緒可以加上同步鎖,並執行接下來的程式碼。這個時候由於例項已經被第一個執行緒建立出來了,第二個執行緒就不會重複建立例項了。但是加鎖是一個比較耗時的操作,我們應該儘量避免。
(3)解法三:加同步鎖前後兩次判斷例項是否已存在
我們只是在例項還沒有建立之前需要加鎖操作,以保證只有一個執行緒建立出例項。而當例項已經建立之後,就不需要加鎖操作了。程式碼實現如下:
public class Singleton3{
private Singleton3(){
}
private static readonly object syncObj = new object();
private static Singleton3 instance = NULL;
public static Singleton3 funcInstance{
get{
if(instance == NULL){
lock(sync){
if(instance == NULL){
instance = new Singleton3();
}
}
}
return instance;
}
}
}
Singleton3中只有當instance為NULL即沒有建立時,需要加鎖操作。當instance已經建立出來後,則無需加鎖。因為只有第一次的時候instance為NULL,因此只有在第一次試圖建立例項的時候需要加鎖,這樣Singleton3的時間效率就比Singleton2好。
github主頁:https://github.com/chenyufeng1991 。歡迎大家訪問!
相關文章
- JAVA中實現單例(Singleton)模式的八種方式Java單例模式
- 單例模式:5種實現方式單例模式
- Python單例模式(Singleton)的N種實現Python單例模式
- Singleton——單例模式(8種)單例模式
- 五種方式實現 Java 單例模式Java單例模式
- 單例模式的各種實現方式(Java)單例模式Java
- 我所理解的設計模式(C++實現)——單例模式(Singleton Pattern)設計模式C++單例
- JS實現單例模式的多種方案JS單例模式
- C++實現單例模式C++單例模式
- 單例模式c++實現單例模式C++
- 單例模式 singleton單例模式
- 單例模式--SingleTon單例模式
- 單例模式(Singleton)單例模式
- Java設計模式——實現單例模式的七種方式[JZOF]Java設計模式單例
- 三種Singleton的實現方式
- 單例模式的五種實現方式及優缺點單例模式
- 設計模式學習(一)單例模式的幾種實現方式設計模式單例
- 單例模式(Singleton Pattern)單例模式
- 設計模式——單例模式C++實現設計模式單例C++
- 設計模式 - 單例模式Singleton的8種寫法設計模式單例
- C++完美實現Singleton模式[轉]C++模式
- Java Singleton的3種實現方式Java
- 【設計模式】實現執行緒安全單例模式的五種方式設計模式執行緒單例
- 單例模式的各種實現單例模式
- 設計模式—singleton(單例模式)設計模式單例
- 設計模式 - 單例模式(Singleton)設計模式單例
- Python單例模式的實現方式Python單例模式
- Singleton 單例設計模式單例設計模式
- laravel singleton 單例模式使用Laravel單例模式
- java設計模式-單例模式SingletonJava設計模式單例
- 設計模式之單例模式 - Singleton設計模式單例
- 設計模式——3單例模式(Singleton)設計模式單例
- OOAD之單例模式Singleton的6種寫法單例模式
- 兩種Delphi實現Singleton模式方法 (轉)模式
- 【C++】實現一個簡單的單例模式C++單例模式
- Java中Singleton的三種實現方式解析Java
- [DELPHI]單例模式(singleton) 陳省單例模式
- 設計模式--單例(Singleton Pattern)設計模式單例