Fork me on GitHub

发现锁定Dictionary的时候,它的属性Keys并没有被锁定

原创文章,未经允许,请勿转载

前几天在压力测试的时候发现的并发问题,记录一下 发现锁定Dictionary的时候,它的属性Keys并没有被锁定(不知道Values是不是也一样?),在遍历Keys的时候还是会报值已修改,无法遍历的错误。 如下代码,横线处会引发错误:

public static void CloneKeyTo(Dictionary<string, object> sourceASO, out Dictionary<string, object> desASO)  
{  
    desASO = new Dictionary<string, object>();  

    lock (sourceASO)  
    {  
        foreach (string key in sourceASO.Keys)
        {  
            desASO[key] = sourceASO[key];  
        }  
    }  
}

解决方案如下:

public static void CloneKeyTo(Dictionary<string, object> sourceASO, out Dictionary<string, object> desASO)  
{  
    desASO = new Dictionary<string, object>();  

    string[] keys;  
    lock (sourceASO.Keys)  
    {  
        keys = new string[sourceASO.Keys.Count];  
        sourceASO.Keys.CopyTo(keys, 0);  
    }  
    foreach (string key in keys)  
    {  
        lock (sourceASO)  
        {  
            if (sourceASO.ContainsKey(key))  
            {  
                desASO[key] = sourceASO[key];  
            }  
        }  
    }  
}

来源:悠游悠游,原文地址:https://yymmss.com/p/77.html