我知道这个话题已经被打砸了,因为我已经阅读了SO和其他地方的帖子的帖子,但我还没有找到一个明确的答案,所以我道歉,如果你是被这种看似冗余的感觉所感染。一次写多次锁
我有一种情况,有一次写入,读取百万资源。该资源的创建非常昂贵,并且写入锁的争用也可能非常高。此外,我无法预测它将运行在哪个处理器上,所以我不知道内存模型将在下面。我正在编译.NET 3.5,.NET 4.0和Mono 2.10中构建的程序集的3个版本。
由于对资源的高度争用,我需要尽可能提高效率,并且希望至少在读取时使用无锁模式。我理解用于创建资源的双重锁定检查模式,但是由于_resource访问内存障碍之外,它是否工作(在所有处理器上)存在分歧。我需要在_resource字段上使用volatile吗? ReaderWriterLockSlim更适合这种情况吗?我应该问什么其他问题?
if(_resource == null)
{
lock(_locker)
{
if(_resource == null)
{
//create resource here...
}
}
}
此外,还会有许多这样的:
if(_resource == null)
{
return _resourceDefault;
}
return _resource.GetSomething();
为什么还要在这里锁定? – leppie 2012-07-16 12:11:59
由于创建资源非常昂贵,我不能让它多做一次。它包括跟踪连接的服务器的远程通信。 – 2012-07-16 12:41:17
好吧,早在线程开始阅读之前就已经完成了。不需要锁。这一切都太模糊,不能给出具体的建议。 – 2012-07-16 13:58:58