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