首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么ConcurrentDictionary TryUpdate()方法需要指示oldValue?

为什么ConcurrentDictionary TryUpdate()方法需要指示oldValue?
EN

Stack Overflow用户
提问于 2022-05-07 08:49:36
回答 1查看 95关注 0票数 1

在调用TryUpdate时,除了键外,还应该指定旧值,为什么需要它?还有另外一个问题,为什么TryUpdate方法(和其他类似的方法)里面有同时(真)循环包装器?

EN

回答 1

Stack Overflow用户

发布于 2022-05-07 09:45:02

ConcurrentDictionary<TKey,TValue>集合旨在支持并发场景,其中操作必须是原子的。例如,假设您有一个具有string键和int值的字典,并且希望增加键"A"的值。以下代码不是原子代码:

代码语言:javascript
运行
复制
dictionary["A"]++;

在读取值和更新值之间,另一个线程可能会更改该值,从而导致另一个线程的更改丢失。如果我们像这样重写上面的代码,就会更容易看到它:

代码语言:javascript
运行
复制
var value = dictionary["A"];
value++;
dictionary["A"] = value;

解决方案是避免使用索引器更新字典,而使用TryUpdate。如果另一个线程拦截了我们的更新,我们将不得不重新开始,直到我们在更新这个键时最终获胜为止:

代码语言:javascript
运行
复制
while (true)
{
    var existing = dictionary["A"];
    var updated = existing + 1;
    if (dictionary.TryUpdate("A", updated, existing)) break;
}

使用while (true)执行循环(也称为“旋转”)是低锁多线程编程中的一种典型技术。

相关问题:有没有一种将ConcurrentDictionary.TryUpdate与lambda表达式结合使用的方法?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72150934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档