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