ConcurrentDictionary
ConcurrentDictionary ile iş parçacığı güvenli sözlüğü öğrenirsin.
ConcurrentDictionary
ConcurrentDictionary<TKey, TValue>, birden çok iş parçacığının güvenle okuyup yazabildiği bir sözlüktür. Okumalar kilit kullanmaz; yazmalar ise her kova (bucket) için ayrı bir ince kilit (fine-grained lock) alır.
Bu sayede aynı Dictionary'i lock ile korumaktan daha hızlı çalışır. GetOrAdd ve AddOrUpdate gibi atomik metotlar, kontrol-ekle yarış durumunu (race condition) ortadan kaldırır.
GetOrAdd ve AddOrUpdate
GetOrAdd(key, value) anahtar yoksa ekler ve değeri döndürür; varsa mevcut değeri döndürür, üzerine yazmaz.
AddOrUpdate(key, addValue, updateFactory) ise yoksa addValue'yu ekler, varsa updateFactory ile eski değeri temel alarak yenisini hesaplar. Sayaç tutarken (key, n) => n + 1 gibi bir fabrika çok kullanışlıdır.
Uygulama ConcurrentDictionary ile sayım yap
Aşağıdaki counts sözlüğü boş. GetOrAdd ile üç anahtar ekle: "elma" = 3, "muz" = 5, "kiraz" = 2. Sonra OrderBy(k => k.Key) ile anahtarları alfabetik sırala ve her satırı $"{kvp.Key}: {kvp.Value}" biçiminde yazdır.
Örnek çözümü göster
{kvp.Value}");
Örnek çözüm:
using System;
using System.Collections.Concurrent;
using System.Linq;
class Program
{
static void Main()
{
var counts = new ConcurrentDictionary<string, int>();
counts.GetOrAdd("elma", 3);
counts.GetOrAdd("muz", 5);
counts.GetOrAdd("kiraz", 2);
foreach (var kvp in counts.OrderBy(k => k.Key))
{
Console.WriteLine($"{kvp.Key}: {kvp.Value}");
}
}
}
Kendini test et
-
ConcurrentDictionary'de anahtar yoksa ekleyip, varsa mevcut değeri döndüren atomik metot hangisidir?
- Add
- GetOrAdd
- TryAdd
- Put
Cevabı göster
GetOrAdd — Doğru. GetOrAdd atomik olarak yoksa ekler, varsa mevcut değeri döndürür.
-
GetOrAdd çağrısını tamamla
counts.____;Cevabı göster
counts.GetOrAdd("elma", 3); -
Metot ve davranışını eşleştir
- GetOrAdd
- Yoksa ekle, varken döndür
- AddOrUpdate
- Yoksa ekle, varsa güncelle
- TryGetValue
- Var mı diye kontrol et