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
似乎是一种“正确”的方法。(至少在我看来,这是一种更为简练的方式)。事实上,字典是