ConcurrentDictionary中的Keys集合是否是线程安全的

时间:2017-12-28 06:12:34

标签: c# concurrency

我必须通过某些键从ConcurrentDictionary中删除项目。像这样:

FusedLocationProviderApi

问题是:我在开始循环时枚举密钥集合。如果有人会在同一时间更改字典怎么办? dict.Keys会返回快照吗?

2 个答案:

答案 0 :(得分:4)

  

ConcurrentDictionary的所有公共成员和受保护成员   是线程安全的,可以从多个线程同时使用。   但是,成员通过其中一个接口访问了   ConcurrentDictionary实现,包括扩展   方法,不保证是线程安全的,可能需要   由来电者同步。

来自https://msdn.microsoft.com/en-us/library/dd287191(v=vs.110).aspx#Anchor_10

答案 1 :(得分:3)

查看source code

public ICollection<TKey> Keys
{
    get { return GetKeys(); }
}

private ReadOnlyCollection<TKey> GetKeys()
{
    int locksAcquired = 0;
    try
    {
        AcquireAllLocks(ref locksAcquired);

        int count = GetCountInternal();
        if (count < 0) throw new OutOfMemoryException();

        List<TKey> keys = new List<TKey>(count);
        for (int i = 0; i < _tables._buckets.Length; i++)
        {
            Node current = _tables._buckets[i];
            while (current != null)
            {
                keys.Add(current._key);
                current = current._next;
            }
        }

        return new ReadOnlyCollection<TKey>(keys);
    }
    finally
    {
        ReleaseLocks(0, locksAcquired);
    }
}

它锁定集合并返回键的副本