在不涉及多线程调用的情况:
public sealed class Singleton
{
private static Singleton instance = null;
private Singleton(){}
public static Singleton Instance
{
get
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
}
解决方案 加个锁
public sealed class Singleton
{
private static Singleton instance = null;
public static readonly object synLock= new object();
private Singleton(){}
public static Singleton Instance
{
get
{
lock(synLock)
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
}
但是多了一个变量 那么我们可以这样
public sealed class Singleton
{
private static Singleton instance = null;
public static readonly object synLock= new object();
private Singleton(){}
public static Singleton Instance
{
get
{
if(instance == null)
{
lock(synLock)//加锁加了性能消耗
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
}
}
一般情况下 我们这样做
public sealed class MYA//seal是防止派生
{
private static readonly Singleton4 instance = new MYA();
static MYA() { }
private MYA() { }
public static MYA Instance
{
get
{
return instance;
}
}
}//确定无法延迟实例化
这种缺陷,我们可以用类种类来实现:
public sealed class MYC
{
private MYC() { }
public static MYC Instance
{
get
{
return Nested.instance;
}
}
private class Nested//要体会类种类带来的好处,这里为什么不用属性或者方法来return一个MYC实例?
{
static Nested() { }
internal static readonly MYC instance = new MYC ();
}
}
#endregion
}