关于Singleton的一个死锁问题
有这么个Double-Check-Locking的Singleton实例
//
//方法一
//
public sealed class Singleton
{
private static volatile Singleton _instance;
private static object syncRoot = new object();
private Singleton() { }
public static Singleton Instance
{
get
{
if(_instance == null)
{
Lock(syncRoot)
{
if(_instance == null)
{
_instance = new Singleton();
}
}
}
return _instance;
}
}
}
//
//方法二
//
public sealed class Singleton
{
private static volatile Singleton _instance;
private Singleton() { }
public static Singleton Instance
{
get
{
if(_instance == null)
{
Lock(typeof(Singleton))
{
if(_instance == null)
{
_instance = new Singleton();
}
}
}
return _instance;
}
}
}
据说, 方法一能避免死锁, 那么想问问, 是如何避免的呢? 还有, 方法二里面什么情况下会出现死锁?
谢谢
------解决方案--------------------方法二也不会出现死锁的,不过一般不锁类型。
怎么避免死锁……只加一个锁是不可能发生死锁的,你看看死锁的定义吧。
------解决方案--------------------Double-Check-Locking只是为了防止多线程时生成多个实例,而不是为了防止死锁