When will ConcurrentDictionary TryRemove return false

Viewed 20097

Will it only return false if the dictionary does not contain a value for the given key or will it also return false due to thread race conditions, like another thread adds/updates something?

Question in code:

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); 

Edit: I think that it only will return false if it does not contain a value for the given key, but want to be absolutely sure.

3 Answers

One other point to make:

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

This comment is incorrect and possibly suffers from the same misconception about what it means to 'try'. It's not about a concurrent attempt to add, it's whether a value has already been added with key 1.

Consider a standard Dictionary<TKey,TValue>. The equivalent code would be:

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

This requires two operations. There's no way to design such an API to be threadsafe, as cd might have a value with key 1 added between the call to Contains and Add, which would then result in Add throwing.

The concurrent collections have APIs that logically bundle these test-and-do pairs into single atomic operations, behind a single API.

Related