Singleton Patterns
保證一個類別僅有一個Instance,並提供一個全域訪問點。
1.該物件自行決定是否被Instance,而不是靠其他物件初始化。(將該物件的Constructor需告成Private)。
2.因建構子私有化,所以產生一個Method為公有化(物件為Publuc 、Static)。
Multithread in Singleton Pattern
給行程一把鎖。(lock)
1: class Singleton
2: {
3: private static Singleton instance;
4: private static readonly object syncRoot = new object();
5: private Singleton(){}
6: public static Singleton GetInstance()
7: {
8: lock(syncRoot)
9: {
10: if(instance == null)
11: {
12: instance = new Singleton();
13: }
14: }
15: return instance;
16: }
17: }
但每當使用GetInstance時,都要lock因此可以再給予改良:
1: class Singleton
2: {
3: private static Singleton instance;
4: private static readonly object syncRoot = new object();
5: private Singleton(){}
6: private static Singleton GetInstance()
7: {
8: if(instance == null)
9: {
10: lock(syncRoot)
11: {
12: if(instance == null)
13: {
14: instance = new Singleton();
15: }
16: }
17: }
18: return instance;
19: }
20: }
只在實體未被建立的時候加鎖處理,同時保證多執行續的安全。Double-Check Locking
第8、12都有 instance==null,這是因為當兩個Thread調用GetInstance()方法時,透過第一層instance ==null的判斷後,lock只會讓其中一個Thread進入,另一個還在外面排隊。若沒有第二層instance ==null 則第一個Thread建立實體後,第二個Thread還可以繼續建立實體,而沒有達到Singleton 目的。
同是要記的阻止Singleton被繼承,因為繼承後可能會增加實體。
1: public sealed class Singleton{}
No comments:
Post a Comment