ExpertiDict

C# · Intermediário · Inglês · Técnico

ConcurrentDictionary

/kənˈkɝənt ˈdɪkʃəˌnɛri/substantivo

Dicionário seguro para acesso por várias threads, com operações compostas como GetOrAdd e AddOrUpdate, sem exigir que o código chame lock por fora.

Onde usar

Aparece em caches e contadores compartilhados. Importa saber que a função fábrica passada a GetOrAdd pode rodar mais de uma vez em caso de disputa, e só um valor vence; use Lazy se a criação for cara.

Em código

using System.Collections.Concurrent;

ConcurrentDictionary<string, int> c = new();
int v = c.GetOrAdd("a", k => k.Length);
c.AddOrUpdate("a", 1, (k, o) => o + 1);
Console.WriteLine(c["a"]); // 2

Exemplos

Swap the dictionary for a ConcurrentDictionary.

Troque o dicionário por um ConcurrentDictionary.

GetOrAdd may run the factory more than once.

O GetOrAdd pode executar a fábrica mais de uma vez.

Cuidado

Não presuma que sequências como ContainsKey seguido de Add são seguras: entre as duas chamadas outra thread pode ter alterado o dicionário.

Veja também

Todos os termos de C#