单例的各种方式实现,本写法以类A为例,泛型可以使用T
单例的使用如下:
#region 单例的各种方式实现,本写法以类A为例,泛型可以使用T public class A { #region 单线程----常规,多线程不安全 ///// <summary> ///// 私有构造函数,防止初始化 ///// </summary> //private A() //{ //} ///// <summary> ///// 私有变量,延迟加载 ///// </summary> //private static A linjieInstance = null; ///// <summary> ///// 公开实例,供外界使用 ///// </summary> //public static A LinjieInstance //{ // get // { // if (linjieInstance == null) // { // linjieInstance = new A(); // } // return linjieInstance; // } //} #endregion #region 单线程----常规,多线程不安全---饿汉模式 ///// <summary> ///// 私有构造函数,防止初始化 ///// </summary> //private A() //{ //} ///// <summary> ///// 私有变量,延迟加载 ///// </summary> //private static readonly A linjieInstance = new A(); ///// <summary> ///// 公开实例,供外界使用 ///// </summary> //public static A LinjieInstance => linjieInstance; ////public static A LinjieInstance ////{ //// get //// { //// return linjieInstance; //// } ////} #endregion #region 单线程----常规,多线程不安全---饥(饿)汉模式 ///// <summary> ///// 私有构造函数,防止初始化 ///// </summary> //private A() //{ //} ///// <summary> ///// 私有变量,延迟加载 ///// </summary> //private static readonly A linjieInstance = new A(); ///// <summary> ///// 公开实例,供外界使用 ///// </summary> //public static A LinjieInstance => linjieInstance; ////public static A LinjieInstance ////{ //// get //// { //// return linjieInstance; //// } ////} #endregion #region 单线程----常规,多线程安全---饱(懒)汉模式---并发字典 ///// <summary> ///// 私有构造函数,防止初始化 ///// </summary> //private A() //{ //} ///// <summary> ///// 私有变量,延迟加载 ///// </summary> //private static readonly A linjieInstance = null; //private static readonly ConcurrentDictionary<int, A> keyValuePairs = new ConcurrentDictionary<int, A>(); ///// <summary> ///// 公开实例,供外界使用 ///// </summary> ////public static A LinjieInstance => keyValuePairs.GetOrAdd(0, new A()); //public static A LinjieInstance //{ // get // { // return keyValuePairs.GetOrAdd(0, new A()); // } //} #endregion #region 单线程----常规,多线程安全---饱(懒)汉模式---Lazy<A> ///// <summary> ///// 私有构造函数,防止初始化 ///// </summary> //private A() //{ //} ///// <summary> ///// 私有变量,延迟加载 ///// </summary> //private static readonly A linjieInstance = null; //private static readonly Lazy<A> LazyInstance = new Lazy<A>(() => new A()); ////private static readonly Lazy<A> LazyInstance = new Lazy<A>(() => new A(),true);// isThreadSafe:true 表示此示例可由多个线程同时使用;false 表示此实例一次只能由一个线程使用。 ///// <summary> ///// 公开实例,供外界使用 ///// </summary> ////public static A LinjieInstance => LazyInstance.Value; //public static A LinjieInstance //{ // get // { // return LazyInstance.Value; // } //} #endregion #region 单线程----常规,多线程安全---原子操作累加 ///// <summary> ///// 变量 ///// </summary> //private int linjieInstance; //public int GetValue() => Interlocked.Increment(ref linjieInstance); ////public int GetValue() ////{ //// return Interlocked.Increment(ref linjieInstance); ////} #endregion #region 单线程----常规,多线程安全---原子操作累加 ///// <summary> ///// 变量 ///// </summary> //private volatile int linjieInstance; //public int GetValue() => ++linjieInstance; ////public int GetValue() ////{ //// return ++linjieInstance; ////} #endregion #region 单线程----常规,多线程不安全----加锁 ///// <summary> ///// 私有构造函数,防止初始化 ///// </summary> //private A() //{ //} ///// <summary> ///// 私有变量,延迟加载 ///// </summary> //private static A linjieInstance = null; ///// <summary> ///// 锁 ///// </summary> //private static readonly object objectlock = new object(); ///// <summary> ///// 公开实例,供外界使用 ///// </summary> //public static A LinjieInstance //{ // get // { // if (linjieInstance == null) // { // lock (objectlock) // { // if (linjieInstance == null) // { // linjieInstance = new A(); // } // } // } // return linjieInstance; // } //} #endregion #region 单线程----常规,多线程不安全----私有静态内部类 ///// <summary> ///// 私有构造函数,防止初始化 ///// </summary> //private A() //{ //} ///// <summary> ///// 公开实例,供外界使用 ///// </summary> //public static A LinjieInstance => Nest.linjieInstance; ////public static A LinjieInstance ////{ //// get //// { //// return Nest.linjieInstance; //// } ////} ///// <summary> ///// 内部静态类 ///// </summary> //private class Nest //{ // /// <summary> // /// 私有变量,延迟加载 // /// </summary> // public static readonly A linjieInstance = null; // static Nest() // { // linjieInstance = new A(); // } // ////上面的写法还可以写成 // ///// <summary> // ///// 私有变量,延迟加载 // ///// </summary> // //public static readonly A linjieInstance = new A(); //} #endregion } #region 单例的各种方式实现,本写法以泛型T public abstract class B<T> where T : class { #region 单线程----常规,多线程不安全----泛型 /// <summary> /// 私有构造函数,防止初始化 /// </summary> private B() { } /// <summary> /// 公开实例,供外界使用 /// </summary> public static T LinjieInstance => Nest.linjieInstance; //public static T LinjieInstance //{ // get // { // return Nest.linjieInstance; // } //} /// <summary> /// 内部静态类 /// </summary> private class Nest { /// <summary> /// 私有变量,延迟加载 /// </summary> internal static readonly T linjieInstance = null; static Nest() { //linjieInstance = new T();//必须有公开的构造函数,同时泛型约束SingletonBase<T> where T : class, new() //nonPublic:如果公共或非公共默认构造函数可以匹配,则为 true;如果只有公共默认构造函数可以匹配,则为 false。 linjieInstance = Activator.CreateInstance(typeof(T), true) as T; //使用指定类型的默认构造函数来创建该类型的实例,公共或非公共默认构造函数可以匹配 //linjieInstance = Activator.CreateInstance<T>() as T; } } #endregion } #endregion #endregion
龙腾一族至尊龙骑
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
2020-03-29 推荐几款提高工作效率的工具软件
2017-03-29 WCF测试小程序
2017-03-29 使用AutoMapper 处理DTO数据对象的转换