CodeBlanks Logo Icon CodeBlanks

ConcurrentDictionary

C# kursu · Uzman · Ders 25/47

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

  1. 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.

  2. GetOrAdd çağrısını tamamla

    counts.____;
    Cevabı göster
    counts.GetOrAdd("elma", 3);
  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

Uzman bölümündeki tüm dersler