来说说(Singleton)单例模式

1.单例模式很常见,这多余的就不说了,我们来实现一个多线程下面的单例,在传统的单例模式下面,我们可以完全保证在程序的整个运行周期类只存在一个实例,但是在多线程的情况下,由于内存没有共享等原因,很有肯能造成多个实例,我们通常的解决方案就是给对象加锁,代码如下:

using System;

public class Singleton
{
	//定义一个静态变量来保存类的实例
	private static Singleton uniqueInstance;

	//定义个标识确保线程的同步
	private static readonly object locker = new object();

	//定义私有构造函数,使外界不能创建该类实例
	private Singleton ()
	{
		
	}

	public static Singleton getInstance()
	{

		if (uniqueInstance == null) {
		
			lock(locker)
			{
				if(uniqueInstance == null)
				{
					uniqueInstance = new Singleton ();
				}
			}
		}
		return uniqueInstance;
	}
}
上面这种解决方案确实可以解决多线程的问题,但是 上面代码对于每个线程都会对线程辅助对象locker加锁之后再判断实例是否存在,对于这个操作完全没有必要的,因为当第一个线程创建了该类的实例之后,后面的线程此时只需要直接判断(uniqueInstance==null)为假,此时完全没必要对线程辅助对象加锁之后再去判断,所以上面的实现方式增加了额外的开销,损失了性能,为了改进上面实现方式的缺陷,我们只需要在lock语句前面加一句(uniqueInstance==null)的判断就可以避免锁所增加的额外开销,这种实现方式我们就叫它 “双重锁定” ,下面具体看看实现代码的:
/// <summary>
/// 单例模式的实现
/// </summary>
public class Singleton
{
	// 定义一个静态变量来保存类的实例
	private static Singleton uniqueInstance;

	// 定义一个标识确保线程同步
	private static readonly object locker = new object();

	// 定义私有构造函数,使外界不能创建该类实例
	private Singleton()
	{
	}

	/// <summary>
	/// 定义公有方法提供一个全局访问点,同时你也可以定义公有属性来提供全局访问点
	/// </summary>
	/// <returns></returns>
	public static Singleton GetInstance()
	{
		// 当第一个线程运行到这里时,此时会对locker对象 "加锁",
		// 当第二个线程运行该方法时,首先检测到locker对象为"加锁"状态,该线程就会挂起等待第一个线程解锁
		// lock语句运行完之后(即线程运行完之后)会对该对象"解锁"
		// 双重锁定只需要一句判断就可以了
		if (uniqueInstance == null)
		{
			lock (locker)
			{
				// 如果类的实例不存在则创建,否则直接返回
				if (uniqueInstance == null)
				{
					uniqueInstance = new Singleton();
				}
			}
		}
		return uniqueInstance;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值