C#初学单例模式

时间:2023-03-09 20:23:18
C#初学单例模式

版本1:最简单的单例模式

public class MySingleton
{
private MySingleton() //构造函数,注意private
{
}
private static MySingleton _Entity = null; //私有字段 public static MySingleton Entity //公共属性
{
get
{
if (_Entity == null) //确保只能创建一次对象
{
MySingleton._Entity = new MySingleton();
}
return MySingleton._Entity;
}
}
}

方法二:

public class MySingleton
{
private MySingleton() //构造函数,注意private
{
}
private static MySingleton _Entity = null; //私有字段 public static MySingleton GetEntity() //公有方法
{
if (_Entity == null) //确保只能创建一次对象
{
MySingleton._Entity = new MySingleton();
}
return MySingleton._Entity;
}
}

两点:1)保证所有构造函数不被外部所调用;2)利用属性或者方法调用对象。

缺点:无法保证线程的安全性,多个线程的情况下可能创建多个对象。

版本2:线程安全的单例模式

public class MySingleton
{
private MySingleton() //构造函数,注意private
{
} private static readonly object obj = new object();
private static MySingleton _Entity = null; //私有字段 public static MySingleton Entity //公共属性
{
get
{
lock (obj) //确保同一时刻,加锁的代码段只能被一个线程执行
{
if (_Entity == null) //确保只能创建一次对象
{
MySingleton._Entity = new MySingleton();
}
}
return MySingleton._Entity;
}
}
}

缺点:无论对象是否已经被创建,都要进行加锁,增加了不必要的开销。

版本3:Double-Checked Locking

public class MySingleton
{
private MySingleton() //构造函数,注意private
{
} private static readonly object obj = new object();
private static MySingleton _Entity = null; //私有字段 public static MySingleton Entity //公共属性
{
get
{
if (_Entity == null) //第一次检验,用于减少不必要的加锁
{
lock (obj) //确保同一时刻,加锁的代码段只能被一个线程执行
{
if (_Entity == null) //第二次检验,确保只能创建一次对象
{
MySingleton._Entity = new MySingleton();
}
}
}
return MySingleton._Entity;
}
}
}

这种方法既保证了线程的安全,又减少了加锁带来的不必要的开销