이 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 메서드를 사용하는 대신 사전의 모든 값을 열거합니다. –