最近、Dictionary
. このようなもの:
private static readonly object _lock = new object();
private static volatile IDictionary<string, object> _cache =
new Dictionary<string, object>();
public static object Create(string key)
{
object val;
if (!_cache.TryGetValue(key, out val))
{
lock (_lock)
{
if (!_cache.TryGetValue(key, out val))
{
val = new object(); // factory construction based on key here.
_cache.Add(key, val);
}
}
}
return val;
}
(ロックの外側で) がコレクションを反復処理している間Dictionary
にコレクションが「成長」する可能性があるため、このコードは正しくありません。多くの状況では非常にありそうもないかもしれませんが、それでも間違っています。_cache.Add()
_cache.TryGetValue
このコードが失敗することを示す簡単なプログラムはありますか?
これを単体テストに組み込むことは理にかなっていますか? もしそうなら、どのように?