MemoryCache.SetのMSDNドキュメント は、残念ながら、スレッドセーフであるかどうかを明示的に示していません。
明示的なロックなしで複数のスレッドから.Get()
および.Set()
を使用しても安全ですか?
はい、MemoryCacheクラス スレッドセーフです :
System.Runtime.Caching.MemoryCacheはスレッドセーフです。複数の同時スレッドがMemoryCacheインスタンスの読み取りと書き込みを行うことができます。内部でスレッドセーフが自動的に処理され、キャッシュが一貫した方法で更新されるようにします。
これが指しているのは、キャッシュ内に格納されているデータ自体がスレッドセーフではない可能性があるということです。たとえば、リストがキャッシュに配置され、2つの別々のスレッドが両方ともキャッシュされたリストへの参照を取得する場合、2つのスレッドが同時にリストを更新しようとすると、2つのスレッドは互いに踏み込んでしまいます。
これは、GetメソッドとSetメソッドがスレッドセーフであると言われていますが、このキャッシュに格納している可能性のあるデータ構造がスレッドセーフでない場合、問題が発生する可能性があります。たとえば、このキャッシュ内に辞書を格納したとします。次に、thread1がGet
を使用してディクショナリをフェッチし、そこから読み取りを開始する一方で、thread2はGet
を使用してこの同じディクショナリをフェッチし、書き込みを試みます。 Get操作はスレッドセーフですが、次に起こることはかなり厄介かもしれません。
MemoryCache
のドキュメントには次のように記載されています:
このタイプはスレッドセーフです。