单例模式
什么是单例模式
单例模式就是在一个程序里面只存在一个实例,不允许创建多个实例。
单例模式的优点
单例模式会控制其实例对象的数量,确保访问的唯一性。
单例模式是通过自己创建自己的唯一实例。
单例模式会给其他对象提供一个获取实例的方法。
单例模式代码
/// <summary>
/// 单例模式
/// </summary>
public class Singleton
{
//定义一个静态变量来保存类的实例
private static Singleton singLeton;
//定义一个私有的构造函数,让外部不能实例化
private Singleton()
{
}
//定义一个访问点,让外部可以进行创建
public static Singleton GetInstance()
{
if (singLeton == null)
{
singLeton = new Singleton();
}
return singLeton;
}
}
}
上面这种写法很简单,但是没有考虑线程安全,如果在多线程下面就会出现多个实例化的对象。
/// <summary>
/// 单例模式
/// </summary>
public class Singleton
{
// 定义一个标识确保线程同步
private static Object ob = new object();
//定义一个静态变量来保存类的实例
private static Singleton singLeton;
//定义一个私有的构造函数,让外部不能实例化
private Singleton()
{
}
//定义一个访问点,让外部可以进行创建
public static Singleton GetInstance()
{
//减少开支,如果已经有实例,这儿进行判断就不用再进入判断
if (singLeton == null)
{
// 当第一个线程运行到这里时,此时会对locker对象 "加锁",
// 当第二个线程运行该方法时,首先检测到locker对象为"加锁"状态,该线程就会挂起等待第一个线程解锁
// lock语句运行完之后(即线程运行完之后)会对该对象"解锁"
// 双重锁定只需要一句判断就可以了
lock (ob)
{
if (singLeton == null)
{
singLeton = new Singleton();
}
}
singLeton = new Singleton();
}
return singLeton;
}
}
}