文章目录
1.懒汉式
csharp
/// <summary>
/// 懒汉式:
/// 1.在使用时才实例化
/// 2.多线程不安全
/// </summary>
public class Singleton1
{
// 定义一个静态变量来保存类的实例
private static Singleton1? instance;
// 定义私有构造函数,使外界不能创建该类实例
private Singleton1()
{
}
// 第一种:定义公有方法提供一个全局访问点
public static Singleton1 GetInstance()
{
if (instance == null)
instance = new Singleton1();
return instance;
}
// 第二种:定义公有属性来提供全局访问点
public static Singleton1 Instance
{
get
{
if (instance == null)
instance = new Singleton1();
return instance;
}
}
}
2.懒汉式(双重锁定)
csharp
/// <summary>
/// 懒汉式(双重锁定):
/// 1.在访问时才实例化
/// 2.多线程安全
/// </summary>
public class Singleton2
{
private static Singleton2? instance;
private static readonly object lockObj = new object();
private Singleton2()
{
}
public static Singleton2 GetInstance()
{
// 检查实例是否为空,如果是空则加锁
if (instance == null)
{
// 加锁
lock (lockObj)
{
// 再次检查实例是否为空,如果是空则创建新实例
if (instance == null)
instance = new Singleton2();
}
}
// 返回实例
return instance;
}
// 属性访问
public static Singleton2 Instance
{
get
{
if (instance == null)
{
lock (lockObj)
{
if (instance == null)
instance = new Singleton2();
}
}
return instance;
}
}
}
3.饿汉式
csharp
/// <summary>
/// 饿汉式:
/// 1.在类加载时初始化
/// 2.多线程安全
/// </summary>
public sealed class Singleton3
{
// 类加载时就初始化
private static Singleton3 instance = new Singleton3();
// 私有构造函数
private Singleton3()
{
}
// 提供一个全局访问点
public static Singleton3 GetInstance()
{
return instance;
}
}