ReadOnlyDictionary is just a wrapper around any other dictionary. As such, it is only as thread-safe, as the main dictionary.
In particular, if there is a thread that changes the underlying dictionary when another thread is read from the wrapper, there is no security guarantee.
If you want ReadOnlyDictionary , which is effectively unchanged on all sides, you can create a clone of the original dictionary, create a wrapper around it ReadOnlyDictionary , and then not store the link to the clone anywhere. When only read operations are performed, it must be thread safe. Of course, if the key or value types are mutable, this opens up a second degree of thread-insecurity, which you need to worry about.
Jon skeet
source share