質問
データベースからオブジェクトの一般的なリストを設定時に更新する静的キャッシュがあります。
これは単純な静的リストです:
private static List<myObject> _myObject;
public List<myObject> FillMyObject()
{
if(_myObject == null || myTimer)
_myObject = getfromDataBase();
}
UpdateMyObject
および RemoveAnEntryFromMyObject
というオブジェクトを更新する2つのメソッドがあります。
すべてが正常に実行されているように見えますが、誰もがたまに大量のエラーを受け取ります。その後、それは消えて再び元気になります。誰が何が起こっているか知っていますか?
解決
ロック静的キャッシュにアクセスまたは更新するときはいつでもステートメント。ロック文は、完了するまで他のスレッドの実行をブロックします。これを行わないと、別のスレッドが行を削除すると同時に、1つのスレッドがコレクションをループしようとしている可能性があります。正確なシナリオによっては、ダブルチェックロックを使用することをお勧めします。
static readonly object lockObj = new object();
private static List<myObject> _myObject;
public List<myObject> FillMyObject()
{
lock (lockObj)
{
if(_myObject == null || myTimer)
_myObject = getfromDataBase();
}
}
public List<myObject> UpdateMyObject(somevalue)
{
lock (lockObj)
{
_myObject.RemoveAll(delegate(myObject o)
{
return o.somevalue == somevalue;
});)
}
}
所属していません StackOverflow