思想:
确保一个类只有一个实例,并为其提供一个全局访问接口
核心:
保证一个类只有一个实例,且外部可访问,只要保证这个效果,可以被视为单例模式(重点是该模式的思想,而不是实现方式)
实现方式:
单线程实现方式:
饿汉模式
开局就创建创建该类对象
public class Singleton
{
public static Singleton _instance = new Singleton();
public static Singleton Instance
{
get { return _instance; }
}
private Singleton() { }
}
使用私有构造防止外部创建该类对象。
公有静态对象Instance可以保证项目在开始运行时就创建该对象的同时外部也可以进行访问
饱汉模式
外部程序访问时,判断是否有该对象,如果没有,再进行创建
public class Singleton
{
private static Singleton _instance;
public static Singleton Instance
{
get
{
if (_instance == null)
_instance = new Singleton();
return _instance;
}
}
private Singleton() { }
}
多线程实现方式:
多线程饿汉模式实现方式与单线程没有什么区别,所以不做过多赘述
线程锁
在单线程饱汉模式代码中,外部程序访问Instance时,会判断该对象是否有对象,如果没有再创建对象,这段代码放到多线程时可能会遇到两个线程的程序访问该模块,前进来的程序还未创建出实例,后进来的程序走到了_instance == null 这里,后进来的程序也会开始创建这个实例。为了避免这一情况,可以使用线程锁来解决。
public class Singleton
{
private static Singleton _instance;
private static object _instanceLock = new object();
public static Singleton Instance
{
get
{
lock (_instanceLock)
if (_instance == null)
{
_instance = new Singleton();
}
return _instance;
}
}
private Singleton() { }
}
lock:如果下面程序已经有线程在访问,会将后续程序卡在当前位置,直至前面程序运行完成。
优缺点:
优点:当需要使用全局属性时,不需要四处引用。
缺点:全局变量促进耦合
对并发不友好,会导致线程同步带来的Bug
没有完美的设计模式,开发者需要自行判断使用环境。