在正确使用单例模式下,多线程的访问可能会让某些操作变成错误
1,正确的单例模式是只实例化一个对象,但是在对象非静态方法的调用上面,却并不会排队依次执行,这也正是我比较困惑的地方,因为单实例会让我觉得所有对该副本成员变量的访问都是可控的,但事实上,并发访问还是会发生。这里总结一下:并发并不只是发生在多副本实例中,单实例并不是线程安全的保护伞。
private SingleInstanceTest() { }
public static readonly SingleInstanceTest singleInstanceTest = new SingleInstanceTest();
public static SingleInstanceTest Instance {
get { return singleInstanceTest; }
}
public Dictionary<int, string> keys = new Dictionary<int, string>();
public void Test(int i)
{
if (!keys.ContainsKey(i))
{
keys.Add(i, i.ToString());
}
}
这是一个简单的计数器实现过程,这段代码不是线程安全的,尽管Test是单实例的一个成员方法。错误原因是两个线程同时调用Test(3),此时keys如果不包含key=3的值的时候&#