2012-10-24 43 views
3

使用双重检查锁定是否正确使用非静态字段?C检查类成员的双重检查锁定#

class Foo 
{ 
    private SomeType member; 
    private readonly object memeberSync = new object(); 
    public SomeType Memeber 
    { 
     get 
     { 
     if(member == null) 
     { 
      lock(memeberSync) 
      { 
       if(member == null) 
       { 
        member = new SomeType(); 
       } 
      } 
     } 
     return object; 
     } 
    } 
} 
+3

你真的*试图实现单例模式吗?如果是这样,则有更清晰的模式。请参阅http://csharpindepth.com/Articles/General/Singleton.aspx –

回答

0

这是一个由某些人推荐的做法,因为您的锁可能不适用,直到另一个锁被释放。

在这种情况下,两个线程同时访问getter,第一个线程获取锁,第二个线程等待。

第一个完成后,第二个线程现在锁定了。

在可能的情况下,您应该检查在当前线程获取锁定之前变量是否已由另一个线程创建。

2

外部检查会提高性能,一旦初始化member,每次访问属性时都不必获取锁。如果您经常从多个线程访问该属性,则锁的性能下降可能非常明显。

内部检查对于防止竞争条件是必要的:没有这种情况,两个线程可能会处理外部if语句,然后两者都会初始化member

严格地说,外if不是必要,但它被认为是很好的做法,(在大量线程的应用程序)的性能优势将是明显的。

6

使用不带静态字段的双重检查锁定是否正确?

是的,没有错,你的代码中使用双重检查与lock得到线程安全延迟加载。如果你使用的是.NET 4,那么建议使用Lazy类,这种方法与线程安全得到相同的结果延迟加载但它也使你的代码更简单,更具可读性。

class Foo 
{ 
    private readonly Lazy<SomeType> _member = 
            new Lazy<SomeType>(() => new SomeType()); 

    public SomeType Member 
    { 
     get { return _member.Value; } 
    } 
}