C#設計模式 —— 單例模式
阿新 • • 發佈:2018-11-27
嗯,這是本人的第一篇隨筆,就從最簡單的單例模式開始,一步一步地記錄自己的成長。
單例模式是最常見的設計模式之一,在專案程式碼中幾乎隨處可見。這個設計模式的目的就是為了保證例項只能存在一個。單例模式往下還能再細分為懶漢模式和餓漢模式。下面逐個來看。
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 }