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

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

概述private object lockObj = new object();private Dictionary<int, string> dict = new Dictionary<int, string>();public string GetOrAddFromDict(int key){ string value; // non-locked access:
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.

总结

以上是内存溢出为你收集整理的c# – 这个非锁定的TryGetValue()字典是否访问线程安全?全部内容,希望文章能够帮你解决c# – 这个非锁定的TryGetValue()字典是否访问线程安全?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1261120.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存