Skip to main content
 首页 » 编程设计

c#之锁定属性

2024年01月18日26三少

我想知道属性中锁的正确使用。我正在编写一个多线程服务器应用程序,其中吞吐量非常重要。如果我有一个这样声明的属性:

    private DataPoint a; 
    private object aLock = new object(); 

最保守的锁似乎是以下锁(称为方法1)。但是,在这种情况下,在初始调用之后的每次调用中,都会产生锁的开销:
    public DataPoint A 
    { 
        get 
        { 
            lock (aLock) 
            { 
                if (a == null) 
                { 
                    a = new DataPoint(); 
                } 
 
                return a; 
            } 
        } 
    } 

或者,我应该将锁移动到仅设置“a”的行(称为方法2)。在这种情况下,可能会多次设置“a”(确定),但是一旦设置,就不会产生锁的开销。
    public DataPoint A 
    { 
        get 
        { 
            if (a == null) 
            { 
                lock(aLock) 
                { 
                    a = new DataPoint(); 
                } 
            } 
 
            return a; 
        } 
    } 

锁定对属性的并发访问的推荐方法是什么?是方法1,方法2还是以上都不是?

谢谢。

请您参考如下方法:

在.NET 4中,您具有System.Lazy<T>类型,可以为您解决以下问题:

class MyClass 
{ 
    private readonly Lazy<DataPoint> lazy = 
        new Lazy<Singleton>(() => new DataPoint()); 
 
    public DataPoint Instance { get { return lazy.Value; } } 
}  

由 Jon Skeet提供