プロパティでのロックの適切な使用について疑問に思っていました。スループットが非常に重要なマルチスレッドサーバーアプリケーションを作成しています。そのように宣言されたプロパティがある場合:
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」が数回設定される可能性がありますが(OK)、一度設定するとロックのオーバーヘッドはありません。
public DataPoint A
{
get
{
if (a == null)
{
lock(aLock)
{
a = new DataPoint();
}
}
return a;
}
}
プロパティへの同時アクセスをロックするための推奨される方法は何ですか?それは方法1、方法2ですか、それとも上記のどれでもありませんか?
ありがとう。