日期:2014-05-19  浏览次数:20693 次

关于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只是为了防止多线程时生成多个实例,而不是为了防止死锁