锁定属性

use*_*169 1 .net c# clr concurrency multithreading

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

    private DataPoint a;
    private object aLock = new object();
Run Code Online (Sandbox Code Playgroud)

最保守的锁似乎如下(称之为方法1).但是,在这种情况下,在初始调用之后的每次调用中,都会有锁的开销:

    public DataPoint A
    {
        get
        {
            lock (aLock)
            {
                if (a == null)
                {
                    a = new DataPoint();
                }

                return a;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

或者,我应该将锁定移动到设置"a"的行(称之为方法2).在这种情况下,有可能将"a"设置多次(这是Ok),但是一旦设置,就没有锁的开销.

    public DataPoint A
    {
        get
        {
            if (a == null)
            {
                lock(aLock)
                {
                    a = new DataPoint();
                }
            }

            return a;
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

Oha*_*der 7

在.NET 4中,您具有System.Lazy<T>为您处理这些问题的类型:

class MyClass
{
    private readonly Lazy<DataPoint> lazy =
        new Lazy<Singleton>(() => new DataPoint());

    public DataPoint Instance { get { return lazy.Value; } }
} 
Run Code Online (Sandbox Code Playgroud)

Jon Skeet提供