加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 这个非锁定的TryGetValue()字典是否访问线程安全?

发布时间:2020-12-15 03:52:53 所属栏目:百科 来源:网络整理
导读:private object lockObj = new object();private Dictionaryint,string dict = new Dictionaryint,string();public string GetOrAddFromDict(int key){ string value; // non-locked access: if (dict.TryGetValue(key,out value)) return value; lock (this
private object lockObj = new object();

private Dictionary<int,string> dict = new Dictionary<int,string>();

public string GetOrAddFromDict(int key)
{
    string value;

    // non-locked access:
    if (dict.TryGetValue(key,out value))
        return value;

    lock (this.lockObj)
    {
        if (dict.TryGetValue(key,out value))
            return value;

        string newValue = "value of " + key; // place long operation here
        dict.Add(key,newValue);

        return newValue;
    }
}

问题a:线程安全吗?如果是,为什么?

问题b:这个双重TryGetValue()模式是怎么调用的?

解决方法

a)这不是线程安全的,因为基础的Dictionary本身不是线程安全的.如果另一个线程同时调用Add,则会发生未定义的行为.

b)这实际上是double-checked locking的尝试.

我建议使用ConcurrentDictionary类,因为它是为这种情况设计的.另一个选择是使用ReaderWriterLockSlim(或ReaderWriterLock),如果您没有定位.NET 4.0.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读