C# TryGetValue本身是线程安全的吗

C# TryGetValue本身是线程安全的吗,c#,dictionary,thread-safety,trygetvalue,C#,Dictionary,Thread Safety,Trygetvalue,所以,我有一本字典Foo 在一个线程中,我有: void Thread1() { ... if (!Foo.TryGetValue(key, out v)) { Foo.Add(new VType()); } ... } 另一个线程访问Foo的唯一时间是通过TryGetValue 那么,我需要锁多少钱?我可以做一些类似于: void Thread1() { ... if (!Foo.TryGetValue(key, out v)) { lock (syn

所以,我有一本
字典Foo

在一个线程中,我有:

void Thread1() {
  ...
  if (!Foo.TryGetValue(key, out v)) {
    Foo.Add(new VType());
  }
  ...
}
另一个线程访问
Foo
的唯一时间是通过
TryGetValue

那么,我需要锁多少钱?我可以做一些类似于:

void Thread1() {
  ...
  if (!Foo.TryGetValue(key, out v)) {
    lock (syncobj) {
      Foo.Add(new VType());
    }
  }
  ...
}
void Thread2() {
  ...
  lock (syncobj) {
    Foo.TryGetValue(key, out v))
  }
  ...
}

Thread1占程序计算的90%,并且多次调用
TryGetValue
。因此,最好不要每次都调用lock。

如果在执行
TryGetValue
的同时,另一个线程上可能发生更新,则每次都必须
lock

TryGetValue
本身是线程安全的,因为多个线程调用
TryGetValue
不会相互干扰。但是,如果任何线程调用
Add
,而其他线程正在使用字典执行其他操作,那么就有可能发生损坏

也就是说,锁可能并不可怕。你说
TryGetValue
被称为“多次”,但你没有说多久调用一次。更重要的是,你没有说你多久可能会发生冲突。在现代硬件上,一个无争用的锁大约要花费50纳秒,所以这不是一笔巨大的开支。你可以试试锁,看看它的性能如何。你也可以考虑一个.


重要的是要理解,
ConcurrentDictionary
不是无锁数据结构,尽管读取操作是以无锁方式完成的。在您的情况下,它可能会表现得更好(可能会更好),但这不是一个既定的条件。

这里有一个:哇。。。我没有在谷歌上找到,我也在寻找。我想我所看到的一切都是在2010年之前。很高兴知道,这更多的是出于好奇而非必要。我试图用速度的“理由”来证明这个问题的合理性
ConcurrentDictionary
似乎是一种“正确”的方法。(至少在我看来,这是一种更为简练的方式)。事实上,
字典是