このValueStoreクラスはスレッドセーフですか? GetInt(文字列キー)のロックスコープは、利回りを中心に拡張する必要がありますか?このクラスはスレッドセーフですか?
public class ValueStore
{
private readonly object _locker = new object();
private readonly Dictionary<string, int> _data =
new Dictionary<string, int>();
public ValueStore(Dictionary<string, int> data)
{
_data = data;
}
public IEnumerable<int> GetInt(string key)
{
IEnumerable<KeyValuePair<string, int>> selected;
lock(_locker)
{
selected = _data.Where(x => x.Key.Equals(key));
}
foreach (KeyValuePair<string, int> pair in selected)
{
yield return pair.Value;
}
}
}
ユニットテストは大丈夫のようだ:
[TestFixture]
public class ValueStoreTest
{
[Test]
public void test1()
{
Dictionary<string, int> data = new Dictionary<string, int>();
for (int i = 0; i < 100000; i++)
{
data.Add(i.ToString(),i);
}
ValueStore vs = new ValueStore(data);
for (int i = 0; i < 900000; i++)
{
ThreadPool.QueueUserWorkItem(delegate
{
for (int j = 0; j < 100000; j++)
{
IEnumerable<int> d = vs.GetInt(j.ToString());
}
});
}
}
}
ここではスレッドセーフな問題よりも深刻な問題があります。間違った辞書を使用しています。あなたはリストのように使っています。 - キーに複数の値を割り当てることができます。できません。したがって、歩留まりは不要です。 - contains/getメソッドだけでなく、辞書のすべての値を列挙しています。 –