Раздел «Безопасность потоков» в статье библиотеки MSDN о классе документирует это:
Любые члены экземпляра не гарантируют поточно-ориентированность.
Это вполне нормально для классов .NET, документация является шаблонной, а в некоторых отдельных случаях неинформативной. Так было и с MemoryCache до обновления документации. Статья обратной связи Connect, на которую ссылается Davide, полезна, чтобы прояснить это:
System.Runtime.Caching.MemoryCache является потокобезопасным. Несколько одновременных
потоки могут читать и записывать экземпляр MemoryCache. внутренне
потокобезопасность автоматически обрабатывается, чтобы гарантировать, что кэш обновлен
в согласованном порядке.
Это может означать, что данные хранятся в кеше
может сам по себе не быть потокобезопасным. Например, если список помещен в
кеш и два отдельных потока оба получают ссылку на кешированный
Список, два потока будут в конечном итоге наступать друг на друга, если они
оба пытаются обновить список одновременно.