单例工具-SingletonUtil
# 简介
静态工具类 SingletonUtil,使用了泛型类型约束,以确保只有类可以用作单例的类型,并使用 lock
语句来确保在创建单例实例时的线程安全。 lockObject
字段用作锁定目标,以确保即使在多线程环境中也只创建单例的一个实例。 Instance
属性提供对单例实例的访问,如果它不存在,则创建它。
# EasyTool.SingletonUtil 类
方法说明:
LazyInstance
: 返回单例对象的唯一实例(饿汉模式)。Instance
: 返回单例对象的唯一实例(懒汉模式)。
其中,Instance
方法使用了双重锁定实现懒汉模式,但是双重锁定在多线程环境下存在线程安全性问题,不推荐使用。LazyInstance
方法使用了线程安全的懒汉模式实现,它会在第一次被调用时创建单例对象,并保证只创建一次。
需要注意的是,T
类型必须是一个类,并且有公共的无参构造函数,否则无法正常工作。
# LazyInstance-返回单例对象的唯一实例
/// <summary>
/// 返回单例对象的唯一实例(懒汉模式)
/// </summary>
public static T LazyInstance => lazyInstance.Value;
# Instance-返回单例对象的唯一实例(饿汉模式)
/// <summary>
/// 返回单例对象的唯一实例(饿汉模式)
/// </summary>
[Obsolete]
public static T Instance
# 代码示例
假设我们有一个名为 MySingleton
的类,它实现了一个简单的计数器功能:
public class MySingleton
{
private static int counter;
private MySingleton()
{
counter = 0;
}
public static MySingleton GetInstance()
{
return SingletonUtil<MySingleton>.LazyInstance;
}
public int GetNextCount()
{
return ++counter;
}
}
在 MySingleton
类中,我们使用了 SingletonUtil<MySingleton>.LazyInstance
属性来获取 MySingleton
类的单例对象。
接下来,我们可以编写一个测试程序,来验证 MySingleton
类的单例对象是否正常工作:
public class Program
{
public static void Main()
{
MySingleton instance1 = MySingleton.GetInstance();
MySingleton instance2 = MySingleton.GetInstance();
Console.WriteLine($"instance1 == instance2: {instance1 == instance2}");
Console.WriteLine($"instance1.GetNextCount(): {instance1.GetNextCount()}");
Console.WriteLine($"instance2.GetNextCount(): {instance2.GetNextCount()}");
}
}
# 输出结果
instance1 == instance2: True
instance1.GetNextCount(): 1
instance2.GetNextCount(): 2
上次更新: 2023/04/26, 22:10:06