單例模式:是設計模式中比較簡單的一種,適合於乙個類只有乙個例項的情況,比如視窗管理,列印緩衝池和檔案系統
單例模式特點:
一.確保乙個類只有乙個例項被建立
2.在不影響單例類的客戶端的情況下允許將來有多個例項,經典的模式:懶漢式,餓漢式,登記式
3.提供了乙個對全域性物件的全域性訪問指標
模式:一.懶漢式:延遲載入,也就是說例項直到第一次用到的時候才會建立(時間來換空間),並在以後僅返回此例項
需要用鎖來保證執行緒的安全性 原因:多個執行緒可能進入判斷是否已經存在例項的if語句,從而不安全
使用double-check來保證執行緒安全,但是處理大量的資料的時候,該鎖會成為嚴重的效能瓶頸
1.靜態成員例項的懶漢模式
classsingleton
public
:
static singleton* getinstance(); //
宣告 };
singleton*singleton::getinstance()
unlock();
//解鎖
}
return m_instance; //
返回例項
}
2.內部靜態例項的懶漢模式
classsingletoninside
public
:
static singletoninside*getinstance()
};
二.餓漢式:一開始就建立了例項,所以後僅返回此例項(空間換時間)
由靜態初始化例項保證執行緒安全性,因為靜態例項初始化在程式開始時進入主函式之前就由主線程以單執行緒的方式完成了初始化,所以不必擔心多執行緒的問題,所以要求高效能時,應使用這種模式,避免繁雜的鎖爭奪。
classsingletonstatic
public
:
static singletonstatic*getinstance()
};//
注意這裡不是進行建立物件,而是進行上述宣告物件的初始化 ,所以必然在main之前
const singletonstatic * singletonstatic::m_instance =new singletonstatic;
思考?為什麼非要用 const static ?
答案:為了更好地執行緒安全,因為const表示的是一旦被賦值,不能修改,static用來保證單例進入main函式之前就已經被初始化了。
三.登記式
登記式實際上是對於一組單例模式進行的維護,主要是在數量上的擴充套件,通過map我們把單例存進去,然後在使用的時候判斷例項是否存在,如果不存在,則建立乙個存入map中,再返回,如果存在直接返回,在數量上分又分為固定數量的和不固定數量的。
登記類單例類為了克服餓漢式單例類以及懶漢式單例類均不可繼承的缺點設計的,只是它的子類例項化只能是懶漢式的,
缺點:(1)由於子類必須允許父類以構造函式呼叫產生例項,這樣它的建構函式必須是公開的,這樣一來就等於允許以這樣的方式產生例項,而不在父類的登記中(2)父類的例項必須存在才能有子類的例項,這在有些情況下是乙個浪費。
publicclass
regsingleton
//保護的預設建構函式
protected
regsingleton()
public
static
regsingleton getinstance(string name)
//如果沒有找到例項,那就建立乙個例項,加入map並返回
if(regsingletonmap.get(name) == null
)
return regsingletonmap.get
(name);
}}
C 實現執行緒安全的單例模式
廢話不多說,常用的 積澱下來。一 懶漢模式 即第一次呼叫該類例項的時候才產生乙個新的該類例項,並在以後僅返回此例項。需要用鎖,來保證其執行緒安全性 原因 多個執行緒可能進入判斷是否已經存在例項的if語句,從而non thread safety.使用double check來保證thread safe...
多執行緒單例模式的安全實現
多執行緒單例模式的實現。通過雙重鎖定,自旋處理,實現安全的多執行緒單例和共享區資料的訪問。資源訪問的形式採用簡單等待處理.同時使用std bind進行函式繫結。atomic lock flag p202 6 3 3.cpp 定義控制台應用程式的入口點。include stdafx.h include...
python 實現執行緒安全的單例模式
單例模式是一種常見的設計模式,該模式的主要目的是確保某乙個類只有乙個例項存在。當你希望在整個系統中,某個類只能出現乙個例項時,單例物件就能派上用場。比如,伺服器的配置資訊寫在乙個檔案中online.conf中,客戶端通過乙個 config 的類來讀取配置檔案的內容。如果在程式執行期間,有很多地方都需...