C 中實現單例模式

2021-09-06 23:40:49 字數 1744 閱讀 3810

單例模式是軟體工程中廣為人知的設計模式。單例模式就是指乙個永遠只能例項化一次。使用的方式是呼叫類裡建立的靜態方法。通常來說,單例模式建立的類,都是不帶形參的 ,原因就是當建立多個例項的時候,如果引數不同的話(比如2個不同的過載建構函式),那麼就會造成一些不必要的問題(如果相同的例項要被建立而且他們使用相同的引數的話,那麼建議使用工廠模式),這篇文章的定位就是沒有 任何的引數的情況下,通常情況下,單例模式是lazy的,也就是說相當的容易建立。

在c#中實現單例模式有很多種方式。我將在下面以上面的目錄的形式呈現給大家,開始我會跟大家介紹最常用的單例模式的寫法,這些寫法的執行緒並不安全,然後會提到懶漢式寫法(lazy-load),然後就是執行緒安全,最後會跟大家介紹一下提高效率的方式。

所有的實現將會用通俗的語言來介紹,但是要注意以下:

注意所有的實現都是用乙個公共的且靜態的屬性作為例項的入口。在所有的情況下屬性可以方便的轉換成方法,而且和執行緒安全或者效率不衝突。

// 不要用這種方式

public sealed class singleton

public static singleton instance

return instance;}}

}

我要表明的是,上面的方法是非執行緒安全的,2個不同的執行緒可以同時進入這個方法,如果instance為空的並且這裡返回真的情況下,都可以建立例項,這顯然違反了單例模式,實際上,在測試以前,例項就已經有可能被建立了,但是記憶體模型不能保證這個例項能被其他的執行緒看到,除非合適的記憶體屏障已經被跨過了。

public

sealed

class

singleton

public

static

singleton instance

return

instance;}}

}}

上述實現是執行緒安全的。這個執行緒在共享的object上取出了一把鎖,然後在建立例項以前檢查這個例項是否被建立了。這個保護了記憶體屏障問題(lock保證了所有的讀取操作是在lock獲得以後發生的,所有的unlock保證了所有的寫操作在lock 釋放以後發生的),這樣就保證了乙個執行緒只能建立乙個例項(每次只有乙個執行緒在這段**中執行),不巧的是,效能上來說,鎖變成了每次都必須的當這個例項被響應的時候。

注意除了在鎖當中鎖住typeof(singleton)這種型別的以外,我鎖住了乙個靜態私有的變數,對於這個類來說。如果是鎖 的乙個物件的話,其他的類可以進入並且鎖住(比如type)這樣會造成效能風險的問題甚至死鎖。這是我的大體偏好 - 也許可能的話,只有鎖住物件才能達到最終的目的,或者某些文章說鎖是為了達到一些特別的目的。(比如等待或者脈衝乙個佇列)。通常來說這樣的物件應該被設定成私有的。這樣會讓寫執行緒安全更加的容易。

public

sealed

class

singleton

public

static

singleton instance}}

return

instance;}}

}

這個實現嘗試了執行緒安全,當然並沒必要每次都要取出lock,但是這種方式有如下4個缺點:

public

sealed

class

singleton

private

singleton()

public

static

singleton instance

}}

c 中單例模式實現總結

前言 最近個人在寫一些小的練手的專案,發現單例模式的應用實在是很廣泛,很多情況下乙個類都需要使用單例模式來實現,因此這裡我再度總結一下單例模式的實現,之前已經總結過一次,當時的例子給的是muduo的單例模式實現,這次再給出幾種其他的實現,同時進行一下比較。餓漢模式 餓漢模式就是在還未使用變數的時候,...

C 實現單例模式

給所需要進行單例的類ctest的建構函式宣告為private或者protected 防止在類外隨意生成ctest的物件 然後宣告乙個靜態成員變數 instance 乙個靜態成員函式getinsance staticctest getinstance staticctest instance 靜態成員...

C 實現單例模式

ifndef singleton h define singleton h include include using namespace std class locker inline locker inline void lock inline void unlock private pthre...