안전하게 업데이트하려는 정적 사전이 있습니다. 초기에는 사전이 비어 있지만 앱이 끝나면 새로운 값이 추가됩니다. 또한 정수 값은 증가 및 감소 할 수있는 개별 카운터로 작동합니다..NET4.0 : 사전 및 그 값을 업데이트하는 스레드 안전 방식
private static Dictionary<string, int> foo = new Dictionary<string, int>();
public static void Add(string bar)
{
if (!foo.ContainsKey(bar))
foo.Add(bar, 0);
foo[bar] = foo[bar] + 1;
}
public static void Remove(string bar)
{
if (foo.ContainsKey(bar))
{
if (foo[bar] > 0)
foo[bar] = foo[bar] - 1;
}
}
나는 스레드 안전성을 제공하는 수단으로 Interlocked class에 독서 있었고, 내가 사용할 수있는 것이 될 수 있다는 것을 나타납니다 그러나
public static void Add(string bar)
{
if (!foo.ContainsKey(bar))
foo.Add(bar, 0);
Interlocked.Increment(ref foo[bar]);
}
public static void Remove(string bar)
{
if (foo.ContainsKey(bar))
{
if (foo[bar] > 0)
Interlocked.Decrement(ref foo[bar]);
}
}
, 내 직감 본능 사전에 새 항목을 실제로 추가 할 때 문제가 해결되지 않으므로 잠금 기능이 즉시 적용됩니다.
private static Dictionary<string, int> foo = new Dictionary<string, int>();
private static object myLock = new object();
public static void Add(string bar)
{
lock(myLock)
{
if (!foo.ContainsKey(bar))
foo.Add(bar, 0);
Interlocked.Increment(ref foo[bar]);
}
}
public static void Remove(string bar)
{
lock(myLock)
{
if (foo.ContainsKey(bar))
{
if (foo[bar] > 0)
Interlocked.Decrement(ref foo[bar]);
}
}
}
이 방법이 이상적입니까, 아니면 정확합니까? 그것을 향상시킬 수 있습니까? 나는 벗어 났습니까?
Interlocked.Increment (ref foo [bar])를 사용하는 것이 가능합니다. 인덱서 또는 속성에서 작동하지 않는다는 오류 메시지가 컴파일되지 않습니까? –