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还是以上都没有?
谢谢.
在.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)
| 归档时间: |
|
| 查看次数: |
158 次 |
| 最近记录: |