剑指offer02_Singleton

02_Singleton

  • 《剑指Offer——名企面试官精讲典型编程题》代码
  •  **著作权所有者:何海涛**
    

题目

设计一个类,我们只能生成该类的一个实例

实现

  • 不好的解法:只适用于单线程
public sealed class Singleton1
{	
	private Singleton1()
	{
	}
	private static Singleton1 instance = null;
	public static Singleton1 Instance
	{
		get
		{
			if(instance == null)
				instance = new Singleton1();
			
			return instance;
		}
	}
}

这种解法当有两个线程同时运行到判断if(instance == null)且instance还未创建时,两个线程都会创建一个实例,这是Singleton1就不满足单例模式的要求了。

  • 不好的解法:可以在多线程环境工作,但是效率不高
    通过加上一个同步锁实现
public sealed class Singleton2
{	
	private Singleton2()
	{
	}
	
	private static readonly object syncObj = new Object();
	
	private static Singleton2 instance = null;
	public static Singleton2 Instance
	{
		get
		{
			lock(syncObj)
			{
				if(instance == null)
					instance = new Singleton2();
			}
			
			return instance;
		}
	}
}

但是加锁是一件十分耗时的操作,导致效率不高。

  • 可行解法:加锁前后两次判断实例是否已存在
public sealed class Singleton3
{	
	private Singleton3()
	{
	}
	
	private static readonly object syncObj = new Object();
	
	private static Singleton3 instance = null;
	public static Singleton3 Instance
	{
		get
		{
			if(instance == null)
			{
				lock(syncObj)
				{
					if(instance == null)
						instance = new Singleton3();
				}
			}
			
			return instance;
		}
	}
}

Singleton3 中只有当instance为null才需要执行加锁操作。如果存在instance则在第一次if(instance == null)判断无须加锁。比Singleton2的时间效率要好多了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值