说明
采用加锁的方式,实现容易出错,效率也收到影响。
所以考虑使用.Net的特性, 即: C#在调用静态构造函数时,初始化静态变量,.net可以保证只调用一次静态构造函数。从而保证只初始化一次实例instance。
同时考虑到不过早的创建实例,实现按需创建实例,所以使用嵌套类,在类中再定义一个私有类型Nested,在该私有类型中调用它的静态构造函数创建实例instance。
代码 不使用锁保证多线程安全 public sealed class Singleton5
{
Singleton5()
{
Console.WriteLine("An instance of Singleton5 is created.");
}
public static Singleton5 Instance
{
get
{
return Nested.instance;
}
}
class Nested
{
static Nested()
{
}
internal static readonly Singleton5 instance = new Singleton5();
}
}
加锁的方式
public sealed class Singleton3
{
private Singleton3()
{
}
private static object syncObj = new object();
private static Singleton3 instance = null;
public static Singleton3 Instance
{
get
{
if (instance == null) //此句判断放在lock前,为了避免每次都去抢锁,耗费时间
{
lock (syncObj)
{
if (instance == null) //此处不能省,假设2个线程同时进入a的位置,第一个线程创建完成后,释放锁,第二个线程拿到锁,此时不判断==null,会再new一个新的对象出来。
instance = new Singleton3();
}
}
return instance;
}
}
}
参考:剑指offer 第二版 面试题2