Dictionary vs ConcurrentDictionary: Thread-Safe Seçim Rehberi
# Dictionary vs ConcurrentDictionary: Thread-Safe Seçim Rehberi
Dictionary normal şartlarda hızlıdır ama birden fazla thread aynı anda erişirse çöker. ConcurrentDictionary ise iş parçacıklarını (thread) güvenli şekilde yönetir.
Birden fazla işin aynı anda veri okuyup yazması gerekiyorsa ConcurrentDictionary kullanmalısın.
Bu kodda iki thread aynı Dictionary'ye yazıyor:
1using System;2using System.Collections.Generic;3using System.Threading;4using System.Threading.Tasks;56var dict = new Dictionary<int, string>();78var tasks = new Task[2];9tasks[0] = Task.Run(() => {10for(int i = 0; i < 5; i++) {11dict[i] = $"Değer {i}";12Thread.Sleep(10);13}14});1516tasks[1] = Task.Run(() => {17for(int i = 5; i < 10; i++) {18dict[i] = $"Değer {i}";19Thread.Sleep(10);20}21});2223Task.WaitAll(tasks);24Console.WriteLine($"Toplam: {dict.Count}");Çıktı: Çoğu zaman çalışır ama bazen `IndexOutOfRangeException` hatası verir. Güvenilir değil.
Aynı işi ConcurrentDictionary ile yaparsak:
1using System;2using System.Collections.Concurrent;3using System.Threading;4using System.Threading.Tasks;56var dict = new ConcurrentDictionary<int, string>();78var tasks = new Task[2];9tasks[0] = Task.Run(() => {10for(int i = 0; i < 5; i++) {11dict[i] = $"Değer {i}";12Thread.Sleep(10);13}14});1516tasks[1] = Task.Run(() => {17for(int i = 5; i < 10; i++) {18dict[i] = $"Değer {i}";19Thread.Sleep(10);20}21});2223Task.WaitAll(tasks);24Console.WriteLine($"Toplam: {dict.Count}");Çıktı: Her zaman `Toplam: 10` çıkar. Güvenli ve hatasız.
Veri ekleme, kontrol etme ve silme:
1var cache = new ConcurrentDictionary<string, int>();23// Ekleme4cache.TryAdd("kullanıcı1", 100);5cache.TryAdd("kullanıcı2", 200);67// Okuma8if(cache.TryGetValue("kullanıcı1", out var deger)) {9Console.WriteLine($"Değer: {deger}"); // Çıktı: Değer: 10010}1112// Silme13cache.TryRemove("kullanıcı2", out _);1415Console.WriteLine($"Kalan: {cache.Count}"); // Çıktı: Kalan: 1- Dictionary: Tek thread, hızlı işlemler, veri çok değişmiyorsa.
- ConcurrentDictionary: Çok thread, web uygulaması, paralel işlemler.
Eğer şüphede kalırsan ConcurrentDictionary kullan. Biraz yavaş olsa da hata yapmaman daha önemli.
0 yorum