Double checked locking on Dictionary "ContainsKey"
Don't do this. It's not safe.
You could be calling ContainsKey
from one thread while another thread calls Add
. That's simply not supported by Dictionary<TKey, TValue>
. If Add
needs to reallocate buckets etc, I can imagine you could get some very strange results, or an exception. It may have been written in such a way that you don't see any nasty effects, but I wouldn't like to rely on it.
It's one thing using double-checked locking for simple reads/writes to a field, although I'd still argue against it - it's another to make calls to an API which has been explicitly described as not being safe for multiple concurrent calls.
If you're on .NET 4, ConcurrentDictionary
is probably the way forward. Otherwise, just lock on every access.
If you are in a multithreaded environment, you may prefer to look at using a ConcurrentDictionary. I blogged about it a couple of months ago, you might find the article useful: http://colinmackay.co.uk/blog/2011/03/24/parallelisation-in-net-4-0-the-concurrent-dictionary/
This code is incorrect. The Dictionary<TKey, TValue>
type does not support simultaneous read and write operations. Even though your Add
method is called within the lock the ContainsKey
is not. Hence it easily allows for a violation of the simultaneous read / write rule and will lead to corruption in your instance