gpt4 book ai didi

c# - 如果 GetOrAdd 正忙于使用相同的键检索值,它会等待吗?

转载 作者:太空狗 更新时间:2023-10-29 22:37:30 26 4
gpt4 key购买 nike

考虑这段代码:

void DoSomething(int key)
{
concurrentDictionary.GetOrAdd(key, (k)=>
{
//Do some expensive over network and database to retrieve value.
});

考虑 2 个线程正在调用 DoSomething(2)。同时他们会看到字典中没有带有 Key==2 的项目。考虑 Thread1 开始执行昂贵的算法来检索 2 的值。

问题 1: Thread2 会等待 Thread1 完成它的工作吗?或者只是尝试检索值本身,并在将其添加到字典时将其丢弃? (因为 Thread1 已经添加了这个)

问题 2:如果 Thread2 不等待,避免多次运行该昂贵算法的最佳解决方案是什么?

最佳答案

它告诉你在 documentation :

If you call GetOrAdd simultaneously on different threads, addValueFactory may be called multiple times, but its key/value pair might not be added to the dictionary for every call.

对于问题 2,我会考虑从 ConcurrentDictionary<int,Something> 更改为到 ConcurrentDictionary<int,Lazy<Something>> addValueFactory在哪里方法简单地构造一个 Lazy<Something> 指定 ExecutionAndPublication 模式。昂贵的操作将由 valueFactory对于 Lazy<Something>

关于c# - 如果 GetOrAdd 正忙于使用相同的键检索值,它会等待吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21571692/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com