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
可能有一个在调用Contains
和Add
之间添加了键1
的值,这会导致Add
throwing。
并发集合具有在逻辑上将这些“testing与执行”对在单个API后面捆绑为单个primefaces操作的API。