考虑以下代码:
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
不等待,那么避免多次运行这个昂贵的算法的最佳解决方案是什么?
addValueFactory
中创建了Lazy<Something>
。现在,可能会创建多个Lazy<Something>
的实例,但是只有一个实际上会最终添加到字典中,而且这个实例也是GetOrAdd
方法返回的唯一实例。 - Damien_The_Unbeliever