Является ли MemoryCache.Set() потокобезопасным?

В документации MSDN для MemoryCache.Set, к сожалению, явно не указано, является ли он потокобезопасным или нет.

Безопасно ли использовать .Get() и .Set() из нескольких потоков без явной блокировки?


person Timwi    schedule 18.07.2011    source источник


Ответы (2)


Да, класс MemoryCache безопасен для потоков:

System.Runtime.Caching.MemoryCache является потокобезопасным. Несколько параллельных потоков могут читать и записывать экземпляр MemoryCache. Внутренняя безопасность потоков автоматически обрабатывается, чтобы обеспечить согласованное обновление кеша.

Это может означать, что данные, хранящиеся в кеше, могут сами по себе не быть потокобезопасными. Например, если список помещается в кеш, и два отдельных потока получают ссылку на кешированный список, два потока в конечном итоге будут наступать друг на друга, если они оба попытаются обновить список одновременно.

При этом методы Get и Set являются потокобезопасными, но если структура данных, которую вы можете хранить в этом кеше, не является потокобезопасной, у вас могут возникнуть проблемы. Представьте, например, что вы сохранили словарь внутри этого кеша. Затем, в то время как поток 1 использует Get для получения словаря и начинает чтение из него, поток 2 использует Get для получения этого же словаря и пытается записать в него. Хотя операция Get будет потокобезопасной, то, что произойдет дальше, может быть довольно неприятным.

person Darin Dimitrov    schedule 18.07.2011
comment
Я извиняюсь за удар, но мне очень любопытно, как следует работать в таком случае. Не могли бы вы немного подробнее рассказать об этом? - person fuaaark; 10.07.2012
comment
Огромный некрок, но для тех, кто просматривает этот поток сейчас, лично я бы справился с этим, синхронизируя блокировку атомарных операций, выполняемых со структурой данных. Скажем, вам нужно перебрать несколько объектов и выполнить обновления, вы должны реализовать код блокировки вокруг блока, который выполняет обновление кеша. - person Marissa; 26.03.2014
comment
На самом деле, как вы сказали, сам кеш памяти является потокобезопасным, но можно хранить структуру данных, которая не является потокобезопасной, и это не проблема с MemoryCache, это также относится и к другим фреймворкам кэширования. - person Alireza Maddah; 31.10.2014

В документации для MemoryCache указано:

Этот тип является потокобезопасным.

person jason    schedule 18.07.2011
comment
OMG, мне действительно не пришло в голову посмотреть документацию для type вместо отдельных методов... - person Timwi; 18.07.2011
comment
@Timwi: Нет проблем. Большинство типов, которые я когда-либо рассматривал, включают в свою документацию заявление о том, что статические члены являются потокобезопасными, а члены-экземпляры не гарантируются. Этот конкретный класс (MemoryCache) вместо этого дает вам счастливый результат, который вы искали. - person jason; 18.07.2011