单例模式(全局访问和实例化控制)
一个类仅有一个实例,并提供一个全局访问点
原理:
- 私有化构造器,外界不能用new创建实例
- 创建公共方法获得实例的全局访问点
- 让类自身负责保存它的唯一实例
单线程锁定
class Program
{
static void Main(string[] args)
{
Singleton s1 = Singleton.GetInstance();
Singleton s2 = Singleton.GetInstance();
Console.WriteLine(s1==s2? "true":"false");
}
}
class Singleton {
// 让类自身负责保存它的唯一实例
private static Singleton instance;
// 私有化构造器,外界不能用new创建实例
private Singleton()
{
}
// 创建公共方法获得实例的全局访问点
public static Singleton GetInstance()
{
if(instance == null)
{
instance = new Singleton();
}
return instance;
}
}
多线程下的双重锁定(被引用实例化)
- 单锁模式:每次调用实例方法都要进行lock,影响性能
- 双锁模式:只有第一次进行实例化时进行锁定,并且是lock多线程锁定
class Singleton {
private static Singleton instance;
private static readonly object syncRoot = new object();
private Singleton()
{
}
public static Singleton GetInstance()
{
// 双锁
if (instance == null)
{
// 单锁
lock (syncRoot)
{
if (instance == null)
{
instance = new Singleton();
}
}
}
return instance;
}
}
静态初始化(被加载实例化)
- sealed 防止派生
- readonly 被加载实例化
public sealed class Singleton {
private static readonly Singleton instance = new Singleton();
private Singleton(){}
public static Singleton GetInstance()
{
return instance;
}
}