嗯,這是本人的第一篇隨筆,就從最簡單的單例模式開始,一步一步地記錄自己的成長。 單例模式是最常見的設計模式之一,在項目代碼中幾乎隨處可見。這個設計模式的目的就是為了保證實例只能存在一個。單例模式往下還能再細分為懶漢模式和餓漢模式。下麵逐個來看。 1.餓漢模式 餓漢模式的做法是在類載入的時候就完成實例 ...
嗯,這是本人的第一篇隨筆,就從最簡單的單例模式開始,一步一步地記錄自己的成長。
單例模式是最常見的設計模式之一,在項目代碼中幾乎隨處可見。這個設計模式的目的就是為了保證實例只能存在一個。單例模式往下還能再細分為懶漢模式和餓漢模式。下麵逐個來看。
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 }