using SuperMap.RealEstate.ServiceModel; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EShang.Common { /* * 单例模式(Singleton) 泛型 * 定义:单例模式的意思就是只有一个实例(整个应用程序的生命周期中)。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。(百度百科~~!) * 要点: 一是某个类只能有一个实例; * 二是它必须自行创建这个实例; * 三是它必须自行向整个系统提供这个实例。 * create zhengxp 2020-10-20 */ /// /// 多线程下的单例模式(Lazy模式)(Singleton) 泛型 /// /// public class SingleBase where T : class //new(),new不支持非公共的无参构造函数 { #region 实现单例 /* * 单线程测试通过! * 多线程测试通过! * 根据需要在调用的时候才实例化单例类! */ //定义一个静态变量来保存类的实例 private static T _instance; /// /// 定义一个标识确保线程同步 /// public static readonly object SyncObject = new object(); /// /// 定义公有方法提供一个全局访问点,同时你也可以定义公有属性来提供全局访问点 /// /// 事务 /// public static T GetInstance(Transaction transaction) { 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), transaction); //第二个参数防止异常:“没有为该对象定义无参数的构造函数。” } } } return _instance; } public static void SetInstance(T value) { _instance = value; } #endregion } }