不支持非公共的無參構造函數的多線程
public abstract class BaseInstance<T> where T : class,new() { private readonly static object lockObj = new object(); private static T instance = null; public static T Instance { get { if (instance == null) { lock (lockObj) { if (instance == null) { instance = new T(); } } } return instance; } } }
支持非公共的無參構造函數的函數
public class BaseInstance<T> where T : class//new(),new不支持非公共的無參構造函數 { /* * 單線程測試經過! * 多線程測試經過! * 根據須要在調用的時候才實例化單例類! */ private static T _instance; private static readonly object SyncObject = new object(); public static T Instance { get { if (_instance == null)//沒有第一重 singleton == null 的話,每一次有線程進入 GetInstance()時,均會執行鎖定操做來實現線程同步, //很是耗費性能 增長第一重singleton ==null 成立時的狀況下執行一次鎖定以實現線程同步 { lock (SyncObject) { if (_instance == null)//Double-Check Locking 雙重檢查鎖定 { //_instance = new T(); //須要非公共的無參構造函數,不能使用new T() ,new不支持非公共的無參構造函數 _instance = (T)Activator.CreateInstance(typeof(T), true); //第二個參數防止異常:「沒有爲該對象定義無參數的構造函數。」 } } } return _instance; } } public static void SetInstance(T value) { _instance = value; } }