單例模式是一種經常使用的軟件設計模式。在它的核心結構中只包含一個被稱爲單例類的特殊類。經過單例模式能夠保證系統中一個類只有一個實例並且該實例易於外界訪問,從而方便對實例個數的控制並節約系統資源。若是但願在系統中某個類的對象只能存在一個,單例模式是最好的解決方案。設計模式
咱們來看一下單例模式下的餓漢模式代碼:安全
/// <summary> /// 餓漢模式 /// </summary> public class Singleton { //私有的構造器 private Singleton() { } //私有的靜態實例 private static Singleton instance = new Singleton(); public static Singleton GetInstance() { return instance; } }
懶漢模式代碼:多線程
/// <summary> /// 懶漢模式 /// </summary> public class Singleton2 { //私有的構造器 private Singleton2() { } //私有的靜態實例 private static Singleton2 instance = null; public static Singleton2 GetInstance() { if (instance==null) { instance=new Singleton2(); } return instance; } }
餓漢模式和懶漢模式的區別:函數
餓漢模式加載類時比較慢,但運行時獲取對象的速度比較快,線程安全的spa
懶漢模式加載類時比較快,但運行時獲取對象的速度比較慢,線程不安全的線程
C# 下的單例模式:設計
一、線程不安全:code
//C# 下的單例模式(線程不安全) public class Singleton3 { public static readonly Singleton3 instance = new Singleton3(); private Singleton3() { } }
上面的實現徹底能夠達到單例模式的意圖,保證一個類僅且有一個實例,並提供一個全局訪問點.而這在實際應用咱們還得注意一點,就是在多線程的調用.於此,咱們還得保證線程安全.要保證線程安全其實也是很簡單就能夠實現的,只須要經過加鎖和雙重判斷就OK,下面是簡單的多線程的線程安全的實現:對象
二、線程安全: blog
//C# 下的單例模式(線程安全) public class Singleton4 { /// <summary> /// 聲明一個靜態鎖 /// </summary> private static object lockHelper = new object(); //私有構造函數 private Singleton4() { } //注意使用 volatile 關鍵字 private static volatile Singleton4 instance = null; //靜態屬性 public static Singleton4 Instance { get { if (instance == null) //雙檢查 { lock (lockHelper) { if (instance == null) { instance = new Singleton4(); } } } return instance; } } }