在c#中,我們對於只會生成乙個例項的類對其實現單例模式。
首先我們實現的是適用於單執行緒環境的單例模式。要注意我們必須將建構函式設為私有,防止其它類建立例項,**如下:
using system;
private static singleton _instance = null;
public static singleton instance
return _instance;}}
}class program
}}
只有當_instance為null的時候我們才會建立乙個例項來避免重複建立,但是這種寫法在單執行緒的時候工作正常,多執行緒時就會出現問題。加入我們有兩個執行緒分別想要同時執行判斷instance是否為null,並且instance在這個時刻確實為null,那麼兩個執行緒就都會建立乙個例項,因此我們需要在程式中加上乙個同步鎖,**如下:
using system;
private static readonly object syncobj = new object();
private static singleton _instance = null;
public static singleton instance
}return _instance;}}
}class program
}}
當我們使用這種寫法建立例項時就能夠避免當兩個執行緒同時建立例項時的問題。因為當想要建立例項的時候,只有乙個執行緒得到了同步鎖,另乙個執行緒等待。第乙個執行緒完成後,同步鎖釋放,並且單例建立完成,第二個執行緒獲得鎖之後不會再去建立單例,而是直接使用第乙個執行緒鎖建立的單例,這樣就解決了多執行緒所帶來的問題。
而這種寫法導致的問題是效率低下,因為加鎖是乙個耗時的操作,而這種寫法在每一次獲取單例的時候都會進行加鎖,這是應該避免的。這一改進很簡單,我們只要將加鎖的步驟放到判斷instance為null的時候就行了,**如下:
using system;
private static readonly object syncobj = new object();
private static singleton _instance = null;
public static singleton instance}}
return _instance;}}
}class program
}}
但是這種加鎖的寫法有點複雜,容易出問題,這時我們可以考慮使用c#中的靜態建構函式,保證建構函式僅呼叫一次,寫法如下:
using system;
private static singleton _instance = new singleton();
public static singleton instance
return _instance;}}
}class program
}}
我們在初始化static變數_instance的時候建立例項,而因為變數為static,會在呼叫static建構函式之前執行構造,因此保證僅呼叫一次。但是這一段**的問題是,如果我們在該類中存在乙個static函式或其他static變數,如果我們使用到了那些static內容而非static的_instance,那麼這個_isntance就會過早的建立,進而降低效率。
我們使用了一種巢狀類來解決這一問題:
using system;
public static singleton instance
}private class nested
internal static readonly singleton _instance = new singleton();}}
class program
}}
我們在內部定義了私有型別nested,當第一次獲取單例的時候,我們會去獲得nested內部的_instance,而要想獲取就會呼叫nested的靜態建構函式。由於nested為私有類,我們僅僅會在這裡有唯一的一次呼叫,這樣就防止了提前構造的發生。 c 單例模式3中寫法
c c c 多執行緒 第一種最簡單,但沒有考慮執行緒安全,在多執行緒時可能會出問題,不過俺從沒看過出錯的現象,表鄙視我 public class singleton public static singleton createinstance return instance 第二種考慮了執行緒安全,...
單例模式寫法
單例模式是最常用到的設計模式之一,熟悉設計模式的朋友對單例模式都不會陌生。一般介紹單例模式的書籍都會提到餓漢式和懶漢式這兩種實現方式。但是除了這兩種方式,本文還會介紹其他幾種實現單例的方式,讓我們來一起看看吧。單例模式是一種常用的軟體設計模式,其定義是單例物件的類只能允許乙個例項存在。許多時候整個系...
C 單例模式的 幾種寫法
最近在學設計模式,學到建立型模式的時候,碰到單例模式 或叫單件模式 現在整理一下筆記。在 design patterns elements of resuable object oriented software 中的定義是 ensure a class only has one instance,...