我有一个静态字典,我想安全地更新它。最初,字典将为空,但在应用程序的生命周期中,它将添加新值。此外,整数值将充当可以递增和递减的单独计数器。
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;
}
}
我一直在阅读联锁类 http://msdn.microsoft.com/en-us/library/system.threading.interlocked.aspx作为提供线程安全的一种手段,看来这可能是我可以使用的东西:
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]);
}
}
}
这种方法是理想的还是正确的?可以改进吗?我还差得远吗?