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