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的时间效率要好多了。