35

残念ながら、MemoryCache.SetのMSDNドキュメントには、スレッドセーフかどうかが明示されていません。

明示的なロックなしで複数のスレッドから使​​用.Get()しても安全ですか?.Set()

4

2 に答える 2

71

はい、MemoryCacheクラスはスレッドセーフです:

System.Runtime.Caching.MemoryCacheはスレッドセーフです。複数の同時スレッドは、MemoryCacheインスタンスの読み取りと書き込みを行うことができます。キャッシュが一貫した方法で更新されるように、内部でスレッドセーフが自動的に処理されます。

これが参照している可能性があるのは、キャッシュ内に格納されているデータ自体がスレッドセーフではない可能性があるということです。たとえば、リストがキャッシュに配置され、2つの別々のスレッドが両方ともキャッシュされたリストへの参照を取得する場合、2つのスレッドが両方ともリストを同時に更新しようとすると、2つのスレッドは互いにステップし合うことになります。

これは、GetメソッドとSetメソッドがスレッドセーフであると言われていますが、このキャッシュに格納している可能性のあるデータ構造がスレッドセーフでない場合、問題が発生する可能性があります。たとえば、このキャッシュ内に辞書を保存したとします。次に、thread1がGetディクショナリのフェッチと読み取りの開始を使用している間、thread2はGetこの同じディクショナリのフェッチと書き込みを試みます。Get操作はスレッドセーフですが、次に何が起こるかはかなり厄介かもしれません。

于 2011-07-18T19:20:55.087 に答える
10

MemoryCache州のドキュメント:

このタイプはスレッドセーフです。

于 2011-07-18T19:22:27.333 に答える