C# 泛型單例


不支持非公共的無參構造函數的

 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;
        }
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM