1. 程式人生 > >C#設計模式 —— 單例模式

C#設計模式 —— 單例模式

  嗯,這是本人的第一篇隨筆,就從最簡單的單例模式開始,一步一步地記錄自己的成長。

  單例模式是最常見的設計模式之一,在專案程式碼中幾乎隨處可見。這個設計模式的目的就是為了保證例項只能存在一個。單例模式往下還能再細分為懶漢模式和餓漢模式。下面逐個來看。

1.餓漢模式

  餓漢模式的做法是在類載入的時候就完成例項化,是執行緒安全的做法。

 1     public class Singleton
 2     {
 3         //類載入的時候完成例項化
 4         private static Singleton instance = new Singleton();
5 6 private Singleton() 7 { 8 } 9 10 //直接返回例項 11 public static Singleton Instance 12 { 13 get 14 { 15 return instance; 16 } 17 } 18 }

 

2.懶漢模式

  懶漢模式的做法就是在類載入的時候不建立例項,在第一次使用的時候才建立。但是這種做法並不是執行緒安全的,如果多個執行緒同時呼叫Instance,便會有多個例項建立,這就違反了單例模式的初衷。

 1     public class Singleton
 2     {
 3         // 類載入的時候不直接建立例項
 4         private static Singleton instance;
 5 
 6         private Singleton()
 7         {
 8 
 9         }
10 
11         public static Singleton Instance
12         {
13             get
14             {
15                 if (instance == null
) 16 { 17 //第一次使用的時候建立例項 18 instance = new Singleton(); 19 } 20 21 return instance; 22 } 23 } 24 }

3.執行緒安全懶漢模式

  如何保證執行緒安全的同時又實現懶漢模式?最簡單的方式就是在if判斷外上鎖。

 1     public class Singleton
 2     {
 3         private static Singleton instance;
 4 
 5         private static readonly object locker = new object();
 6 
 7         private Singleton()
 8         {
 9 
10         }
11 
12         public static Singleton Instance
13         {
14             get
15             {
16                 //上鎖
17                 lock (locker)
18                 {
19                     if (instance == null)
20                     {
21                         instance = new Singleton();
22                     }
23                 }
24 
25                 return instance;
26             }
27         }
28     }

  但是這種做法在每次訪問前的需要上鎖,會影響多執行緒的效能,於是我們又有了雙重檢驗鎖。

4.雙重檢驗鎖

  我們只需要在上鎖之前再作一次if判斷,就不會每次訪問的時候都需要上鎖了。

 1     public class Singleton
 2     {
 3         private static Singleton instance;
 4 
 5         private static readonly object locker = new object();
 6 
 7         private Singleton()
 8         {
 9 
10         }
11 
12         public static Singleton Instance
13         {
14             get
15             {
16                 if (instance == null)
17                 {
18                     lock (locker)
19                     {
20                         if (instance == null)
21                         {
22                             instance = new Singleton();
23                         }
24                     }
25                 }
26 
27                 return instance;
28             }
29         }
30     }