SO やその他のサイトでキャッシュとスレッドの同期についてかなり読んだことがありますが、まだ質問に対する答えが得られません。
静的ディクショナリ キャッシュの .NET スレッド セーフ
ロックが別々のオブジェクトに対して実行されるのはなぜですか?
http://msdn.microsoft.com/en-us/magazine/cc188793.aspx
...
外部からのみ読み取られるリソースを公開するキャッシュを実装しようとしています。これらのリソースは更新できますが、頻繁に更新されるわけではなく、それほど時間もかかりません。
基本的に、リソースはキー値 (id と文字列) のリストであり、それほど大きくはありません (要素数は 100 を超えません)。
そのため、ほとんどの場合は必要ないため、同期のオーバーヘッドを回避するために読み取りメソッドにロックをかけたくありませんが、リソースを更新する必要があるときに使用したいと思います。
私の質問は次のとおりです。次のようなことを行う方法はありますか:
public class AFTypeCache<T> where T : class
{
private Dictionary<int, T> _types;
private Func<Dictionary<int, T>> _dataProvider;
private readonly object _sync = new object();
public void UpdateData()
{
// here something (?) to make sure no more threads are reading the resource
lock (_sync)
{
_types = _dataProvider();
}
}
public IEnumerable<int, T> Get()
{
// thought about something like that but I'm pretty sure this won't work...
if (_updating)
{
lock
{
return _types;
}
}
else
{
// I know not the way to get enumerator but that's not the point
return _types;
}
}
}
また、これを達成しようとするのは本当に便利ですか、それとも間違った方法でGet
メソッドでロックを使用する必要がありますか?
編集:
さらにGoogle検索を行った後、より正確な質問があります. クラス参照が他のスレッドで使用されているかどうかを知ることは可能ですか?