- 單例模式:
保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。
為了解決兩個問題:
//簡單單例
class Singleton
{
private static Singleton instance;
private Singleton()
{
}
public static Singleton GetInstance()
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
//客戶端代碼
static void Main(string[] args)
{
Singleton s1 = Singleton.GetInstance();
Singleton s2 = Singleton.GetInstance();
if(s1 == s2){
Console.WriteLine("兩個對象是相同的實例");
}
Console.Read();
}
- 多線程單例
當多個線程同時訪問 Singleton 類的時候,會有可能創(chuàng)建出多個實例。這時就需要一把 lock 來確保當一個線程位于代碼的臨界區(qū)時,另一個線程不進入臨界區(qū)。如果其他線程試圖進入鎖定的代碼,那么它將一直等待,直到該對象被釋放。
//多線程單例
class Singleton
{
private static Singleton instance;
private static readonly object syncRoot = new object();
private Singleton()
{
}
//這樣做的缺點就是 每次創(chuàng)建的時候都需要 lock。
// public static Singleton GetInstance()
// {
// lock(syncRoot)
// {
// if(instance == null)
// {
// instance = new Singleton();
// }
// }
// return instance;
// }
//先判斷實例是否存在,不存在再加鎖處理
public static Singleton GetInstance()
{
//判斷兩次實例是否為null 的道理在于,第一次判斷是為了避免頻繁加鎖
/*第二次判斷是為了防止多線程多次創(chuàng)建實例當多個線程同時訪問的時候,會允許一個線程進去,當一個線程創(chuàng)建完對象之后,另一個線程進入如果不判斷非空的情況,那么也會出現(xiàn)重復(fù)創(chuàng)建的情況。*/
if(instance == null){
lock(syncRoot){
if(instance == null)
{
instance = new Singleton();
}
}
}
return instance;
}
}
//這種靜態(tài)初始化方式是在自己被加載的時候就將自己實例化,上面的在第一次被引用的時候才會將自己實例化,屬于懶加載。
public sealed class Singleton
{
//在第一次引用類的任何成員時創(chuàng)建實例。公共語言運行庫負責(zé)處理變量初始化
private static readonly Singleton instance = new Singleton();
private Singleton(){}
public static Singleton GetInstance()
{
return instance;
}
}
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。