【发布时间】:2013-10-24 13:53:37
【问题描述】:
考虑以下代码:
Dictionary<string, string> list = new Dictionary<string, string>();
object lockObj = new object();
public void MyMethod(string a) {
if (list.Contains(a))
return;
lock (lockObj) {
list.Add(a,"someothervalue");
}
}
假设我同时从不同的线程调用MyMethod("mystring")。
是否可能有多个线程(我们将其视为两个)同时输入 if (!list.Contains(a)) 语句(有一些 CPU 周期差异),两个线程都被评估为 false一个线程进入临界区,另一个被锁在外面,所以第二个线程进入并在第一个线程退出后再次将"mystring"添加到列表中,导致字典尝试添加重复键?
【问题讨论】:
-
调用字典
list真的很卑鄙。它给人的印象是它是一个列表,而不是字典。 -
@Servy 我将我的狗命名为“猫”。这也意味着什么?
-
@Cruncher 不,因为猫太棒了。
-
@Servy 所以你的意思是你不喜欢列表?
标签: c# multithreading