乙個類只能建立乙個物件,即單例模式,該模式可以保證系統中該類只有乙個例項,並提供乙個訪問它的全域性訪問點,該例項被所有程式模組共享。比如在某個伺服器程式中,該伺服器的配置資訊存放在乙個檔案中,這些配置資料由乙個單例物件統一讀取,然後服務程序中的其他物件再通過這個單例物件獲取這些配置資訊,這種方式簡化了在複雜環境下的配置管理。
單例模式有兩種實現模式:
不管將來用不用,程式啟動時(main函式之前)就建立乙個唯一的例項物件
// 餓漢模式
class
singleton
private
:// 建構函式私有化
singleton()
// 拷貝建構函式封掉
singleton
(const singleton&)=
delete
;static singleton _sinst;};
singleton singleton::_sinst;
// main函式之前就建立初始化了這個例項物件--物件在靜態區
如果這個單例物件在多執行緒高併發環境下頻繁使用,效能要求較高,那麼顯然使用餓漢模式來避免資源競爭,提高響應速度更好
最後一刻(第一次呼叫getinstance時)才建立物件
如果單例物件構造十分耗時或者占用很多資源,比如載入外掛程式、 初始化網路連線、讀取檔案等等,而有可能該物件程式執行時不會用到,那麼也要在程式一開始就進行初始化,就會導致程式啟動時非常的緩慢。 所以這種情況使用懶漢模式(延遲載入)更好
class
singleton
return *_spinst;
*//* 2.解決了執行緒安全問題,但第乙個執行緒建立好了例項之後,後面的執行緒進來雖然不建立例項,仍然需要加鎖解鎖
_smtx.lock(); // 加鎖
if (_spinst == nullptr)
_smtx.unlock(); // 解鎖
return *_spinst;
*/// 餓漢模式有執行緒安全問題,需要加鎖
// 3.雙檢查解決鎖的效率問題
if(_spinst ==
nullptr
)// 解決效率問題,後面的執行緒發現已有例項就不進去,防止加鎖解鎖
_smtx.
unlock()
;}return
*_spinst;
}private
:// 建構函式私有化
singleton()
// 拷貝建構函式封掉
singleton
(const singleton&)=
delete
;static singleton* _spinst;
static mutex _smtx;};
singleton* singleton::_spinst =
nullptr
;// main函式之前就建立初始化指標
mutex singleton::_smtx;
單例模式實現
單例模式 singleton 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。1 適用於單執行緒 class singleton public static singleton getinstance return instance 註解 singleton的靜態屬性instance中,只有...
單例模式實現
推薦的單例實現方法 餓漢模式 1種 public class singleton public static singleton getinstance 雙重檢查 volatile關鍵字必須加 public class singleton public static singleton getins...
單例模式實現
什麼是設計模式 設計模式 design pattern 是一套被反覆使用 多數人知曉的 經過分類的 設計經驗的總結 使用設計模式的目的 為了 可重用性 讓 更容易被他人理解 保證 可靠性 什麼是單例模式 單例模式是設計模式的一種,也是最簡單的一種,在單例模式中乙個類只能建立乙個例項,這種設計模式可以...