Singleton模式的實現

2021-08-19 16:44:12 字數 1501 閱讀 3692

設計乙個類,我們只能生成該類的乙個例項。

因為我們只能生成乙個例項,所以我們必須把建構函式設定為私有函式已禁止他人建立例項。可以定義乙個靜態的例項,在需要的時候建立該例項。

public sealed class sinleton1

private static singleton1 instance = null;

public static singleton1 instance

}}

**中,singleton的靜態屬性instance中,只有在instance為null的時候才會建立乙個例項避免重複建立。同時我們吧建構函式定義為私有函式,這樣就能確保只建立乙個例項。

2中的**在單執行緒中是可以工作的,但是再多執行緒的情況下就會出現問題。假如兩個執行緒同時執行到判斷 instance==null語句時,並且這個時候instance確實沒有被建立,那麼兩個執行緒都會建立乙個instance,此時型別singleton就不滿足單例模式的要求了。為了保證多執行緒條件下,我們仍能只得到型別的乙個例項,需要加上乙個同步鎖。**如下:

public sealed class singleton2

private static readonly object syncobj = new object();

private static singleton2 instance = null;

public static singleton2 instance

return instance;}}

}

由於乙個時刻只有乙個執行緒能得到同步鎖,當第乙個執行緒加上瑣事,第二個執行緒只能等待。當地乙個執行緒發現例項還沒有建立時,他會建立乙個例項。接著第乙個執行緒釋放同步鎖,此時第二個執行緒可以加上同步鎖,並執行接下來的**。這個時候由於例項已經被第乙個執行緒建立出來了,第二個執行緒就不會建立例項了。這就保證了我們在多執行緒換金鐘只能得到乙個例項。

然而我們不得不接受這樣的乙個現實,每次通過屬性instance得到singleton2的例項,都會試圖加上乙個同步鎖,而加鎖是乙個非常耗時的操作,在沒有必要的時候應該避免。

public sealed class singleton3

public static singleton3 instance

}class nested

internal static readonly singleton3 instance = new singleton3();

}}

內部定義了乙個私有型別nested,當第一次用到這個巢狀型別的時候,就會呼叫靜態建構函式singleton3的例項instance。型別nested只在屬性singleton3.instance中被用到,由於它是私有的,其他人無法使用nested型別。因此,當我們第一次試圖通過屬性singleton3instance得到singleton3的例項時,會自動呼叫nested的靜態建構函式建立例項instance。

實現singleton模式2

package swordoffre.gaopengyu 劍指offer2題 實現singleton模式 public class singleton2 private static singleton2 singleton new singleton2 public static singleto...

C 實現Singleton模式

單例模式定義 保證乙個類僅有乙個例項,並提供乙個該例項的全域性訪問點。類的宣告 class singleton singleton singleton m instance nullptr 解法1 執行緒非安全版本 singleton singleton getinstance return m i...

模式實現 可被繼承的 Singleton

可被繼承的singleton singleton 模式在日常工作中的使用頻率應當是很高的。一般的全域性資料,全域性函式等都可以放入乙個 singleton 類中。singleton 模式是如此的熟為人知,以至於許多的 c 大拿都有專門論述。如果你想非常全面地了解它,建議讀讀四人幫的設計模式,讀讀 l...