ConcurrentDictionary TryRemove何时会返回false

如果字典不包含给定键的值,还是会因为线程争用条件返回false而返回false,如另一个线程添加/更新的东西?

代码中的问题:

ConcurrentDictionary<int, string> cd = new ConcurrentDictionary<int, string>(); // This might fail if another thread is adding with key value of 1. cd.TryAdd(1, "one"); // Will this ever fail if no other thread ever removes with the key value of 1? cd.TryRemove(1); 

编辑:我认为它只会返回false,如果它不包含给定的键的值,但要绝对肯定。

虽然Mitch是正确的ConcurrentDictionary不容易受到竞争条件,我认为你所问的问题的答案是,是的,如果关键是目前, TryRemove将工作,并将返回true

在你发布的代码中, TryRemove没有办法返回false因为cd是一个本地variables而不是其他地方访问的。 但是如果别的代码被赋予了这个ConcurrentDictionary对象的引用,并且正在删除一个单独的线程上的键,那么TryRemove可能会返回false ,甚至在这里 – 但只是因为这个键已经被删除了 ,而不是因为其他一些动作在字典上执行,关键是在某处“卡住”在那里。

ConcurrentDictionary不受竞争条件的影响。 这就是为什么你使用它。

返回值

如果对象已成功移除,则为true; 否则,是错误的。

还有一点要说明的是:

 // This might fail if another thread is adding with key value of 1. cd.TryAdd(1, "one"); 

这个评论是不正确的,并可能遭受同样的错误概念“试”。 这不是一个并发的尝试添加,而是一个值是否已经添加了关键字1

考虑一个标准的Dictionary<TKey,TValue> 。 等效的代码是:

 if (!d.Contains(1)) d.Add(1, "one"); 

这需要两个操作。 有没有办法devise这样的API是线程安全的,因为cd可能有一个在调用ContainsAdd之间添加了键1的值,这会导致Add throwing。

并发集合具有在逻辑上将这些“testing与执行”对在单个API后面捆绑为单个primefaces操作的API。