2012-02-01 7 views
1

キャッシュオブジェクトを使用してXMLDocumentオブジェクトを保持していました。 は、具体的には、コードは次のとおりです。ほとんど読み取り専用のオブジェクトを持つASP.NETスレッドセーフキャッシュオブジェクトの使用

XmlDocument xDoc = new XmlDocument(); 
if (HttpRuntime.Cache.Get("AuthorizationXML") == null) 
{ 
    string file = GetAuthorizationXmlFilePath(); 
    xDoc.Load(file); 
    HttpRuntime.Cache.Insert("AuthorizationXML", xDoc, new CacheDependency(file)); 
} 
else 
{ 
    xDoc = (XmlDocument)HttpRuntime.Cache.Get("AuthorizationXML"); 
} 

return xDoc; 

はとにかく、私のチームリーダーは、キャッシュオブジェクトがスレッドセーフであるので、それは廃棄物がほとんど読み取り専用オブジェクトのためにそれを使用することになり、実装する方がよいだろうことを示唆しアプリケーションオブジェクト上のシングルトンフリースレッドオブジェクトとしてのキャッシュオブジェクト。 この文は正当なものですか? スレッドセーフとは、キャッシュオブジェクトがロックで実装されていることを意味します。 キャッシュから読み込むだけでロックが適用されますか? コメントありがとうございます。

+1

コードに競合があります。最初にチェックしたときにキャッシュアイテムがnullでない可能性があります。つまり、アイテムがキャッシュから消えてしまったときに、 'else'節に移動します。 – LukeH

+0

ありがとうございますが、私はnullに変更することを期待していません、それは一度読み込まれ、コードはnullに設定されていません。 – Tomer

答えて

1

ASP.NETは、キャッシュ内のアイテムを変更する際のスレッドの安全性のみを保証しますが、キャッシュ内に保持されているオブジェクトを変更する場合は保証しません。したがって、キャッシュから取得するオブジェクトが不変でない場合(作成後に変更できない場合)、ASP.NETキャッシュはではなく、を保護します。不変ではありません

オブジェクトが複数のスレッドによって再利用されない必要があります。 ASP.NETキャッシュまたはグローバルに定義された変数に格納するかどうかは関係ありません。スレッド上で変更可能なオブジェクトを再利用することは危険であり、(偶然に)変更された場合には、競合状態につながる可能性があります。

オブジェクトが不変の場合、すべてのスレッドが危険なく使用できるため、オブジェクトを格納する場所は関係ありません。 CacheやGlobal/Singletonの使用は、スレッドセーフなオブジェクトを必要とし、キャッシュの保証がかなり不十分なのでオブジェクトのスレッドセーフとは何の関係もありません。

ASP.NETキャッシュを使用すると、ある期間アイテムをキャッシュに保持できますが、AppDomainが終了するまでシングルトン(定義ごと)はそこにとどまります。だから、あなたがシングルトン以外のものよりも、AppDomainの生涯(あなたの例ではCacheDependencyを使って表示する)ごとにアイテムを2回以上リフレッシュする必要がある場合は、 ASP.NETキャッシュなど)。

+0

OPの問題は、オブジェクトが安全にアクセスされることを保証するものではなく、パフォーマンスに問題があるように思えます。キャッシュが一度に1つのリーダのみを許可していて、アプリが変数を読んでいるだけであれば、スレッドが待つ本当の理由がないときにスレッドがたくさん待機します。しかし、キャッシュがスマートリーダ/ライタロックで実装されている場合、これは問題になりません。 OPの質問は、どのロック機構が使用されているのか、また、多くの同時読み取りでどのように動作するのかです。 – Servy

+0

ありがとうServy、あなたが私を持って、それは私が目指しているものです。 Stevenに感謝します。私はCacheDependencyを使用していますが、実際にXMLを変更する可能性はほとんどありません。私が知っている限り、キャッシュISはシングルトンとして実装されているので、そこには選択肢はありません。シングルトンになります。スレッドセーフであれば一般的にパフォーマンス上の問題があるかどうか不思議です。それはこれが好きです。 ところで、オブジェクトが不変であることを確認する方法はありますか?私はパフォーマンスの問題についてより多くの反応が好きです。 – Tomer

+0

キャッシュの周りにロックがあると、まっすぐなミューテックスだけではなく、リーダ/ライターのロックを使用していると合理的に確信しています。さらに、キャッシュへのアクセスは非常に速く、ロックが保持される時間はかなり短くなければなりません。しかし、それらは単に推測された推測であり、私は参照がないため、実際の答えが欠けています。 – Servy

関連する問題