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;
5
6var dict = new Dictionary<int, string>();
7
8var 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});
15
16tasks[1] = Task.Run(() => {
17for(int i = 5; i < 10; i++) {
18dict[i] = $"Değer {i}";
19Thread.Sleep(10);
20}
21});
22
23Task.WaitAll(tasks);
24Console.WriteLine($"Toplam: {dict.Count}");

Çıktı: Çoğu zaman çalışır ama bazen `IndexOutOfRangeException` hatası verir. Güvenilir değil.

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası

Aynı işi ConcurrentDictionary ile yaparsak:

1using System;
2using System.Collections.Concurrent;
3using System.Threading;
4using System.Threading.Tasks;
5
6var dict = new ConcurrentDictionary<int, string>();
7
8var 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});
15
16tasks[1] = Task.Run(() => {
17for(int i = 5; i < 10; i++) {
18dict[i] = $"Değer {i}";
19Thread.Sleep(10);
20}
21});
22
23Task.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>();
2
3// Ekleme
4cache.TryAdd("kullanıcı1", 100);
5cache.TryAdd("kullanıcı2", 200);
6
7// Okuma
8if(cache.TryGetValue("kullanıcı1", out var deger)) {
9Console.WriteLine($"Değer: {deger}"); // Çıktı: Değer: 100
10}
11
12// Silme
13cache.TryRemove("kullanıcı2", out _);
14
15Console.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.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz