ConcurrentDictionary<T> ve değişmez koleksiyonlar
İş parçacığı güvenli güncellemeler için ConcurrentDictionary kullanın; salt okunur görünümleri ve kopyalayarak yazma yaklaşımını içeren basit değişmezlik yöntemlerini öğrenin.
ConcurrentDictionary<T> ve değişmez koleksiyonlar, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 3 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C# Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C# Academy kursu toplamda 3 dersten oluşur.
İş parçacığı güvenliği ve değişmezlik temelleri
Bugün:
- ConcurrentDictionary<TKey,TValue>: birden çok iş parçacığından güvenli güncellemeler
- Salt okunur görünümler ve gerçek değişmezlik arasındaki fark
- Basit güvenlik için yazma sırasında kopyalama fikri
Atomik işlemler: GetOrAdd/AddOrUpdate
Atomik işlemler için GetOrAdd ve AddOrUpdate, güvenli okuma için TryGetValue kullanın.
using System;
using System.Collections.Concurrent;
public class Program
{
public static void Main(string[] args)
{
ConcurrentDictionary<string, int> counts = new ConcurrentDictionary<string, int>();
// Add if missing
int a = counts.GetOrAdd("apple", 0); // 0
// Increment safely
int newVal = counts.AddOrUpdate("apple", 1, (key, oldValue) => oldValue + 1);
Console.WriteLine("apple was " + a + ", now " + newVal);
int value;
bool ok = counts.TryGetValue("apple", out value);
Console.WriteLine("Has apple? " + ok + " -> " + value);
}
}
Yarışsız artırma fikri
AddOrUpdate, atomik güncelleme yaparak klasik okuma-değiştirme-yazma yarışını önler.
using System;
using System.Collections.Concurrent;
public class Program
{
static int Inc(int oldValue) { return oldValue + 1; }
public static void Main(string[] args)
{
ConcurrentDictionary<string, int> clicks = new ConcurrentDictionary<string, int>();
// Simulate multiple updates
for (int i = 0; i < 5; i++)
{
clicks.AddOrUpdate("home", 1, delegate(string k, int v) { return Inc(v); });
}
Console.WriteLine("home clicks = " + clicks["home"]); // 5 (starting at 1 then +4)
}
}
Salt okunur görünüm (değişmez değil)
AsReadOnly, gerçek anlamda değişmez bir koleksiyon değil, salt okunur bir görünüm döndürür: kaynakta yapılan değişiklikler görünümde görünür.
using System;
using System.Collections.Generic;
public class Program
{
public static void Main(string[] args)
{
List<string> items = new List<string>(new string[] { "A", "B" });
var ro = items.AsReadOnly(); // ReadOnlyCollection<string>
foreach (string s in ro) Console.WriteLine(s); // A, B
// ro.Add("C"); // not available: read-only view has no Add
// But changing the source list reflects in the view:
items.Add("C");
Console.WriteLine("After source change:");
foreach (string s in ro) Console.WriteLine(s); // A, B, C
}
}
Yazma sırasında kopyalama anlık görüntüsü
Yazma sırasında kopyalama: değişiklikler için yeni bir liste döndürün. Eski listeyi elinde tutan çağıran kod, sabit bir anlık görüntü görür.
using System;
using System.Collections.Generic;
public class Program
{
static List<int> AddWithoutTouchingOriginal(List<int> original, int item)
{
// create a copy and modify the copy
List<int> copy = new List<int>(original);
copy.Add(item);
return copy;
}
public static void Main(string[] args)
{
List<int> a = new List<int>(new int[] { 1, 2 });
List<int> b = AddWithoutTouchingOriginal(a, 3);
Console.WriteLine("Original:");
foreach (int x in a) Console.WriteLine(x); // 1,2
Console.WriteLine("Copy:");
foreach (int x in b) Console.WriteLine(x); // 1,2,3
}
}
İpuçları ve ödünler
İpuçları:
- Paylaşılan sayaçlar ve önbellekler için ConcurrentDictionary kullanın.
- AsReadOnly, tüketicilerin yanlışlıkla değişiklik yapmasını önler.
- Sabit bir görünüm için değiştirmeden önce listeyi kopyalayın.
- Gerçek değişmez koleksiyonlar System.Collections.Immutable paketinde bulunur; kodu bağımsız tutmak için burada kullanılmamıştır.
İş parçacığı güvenli sözlük seçimi
Özet
Özet: Eşzamanlı güncellemeler için ConcurrentDictionary kullanın. Çağıran koda salt okunur görünümler sunun; sabit anlık görüntülere ihtiyaç duyduğunuzda yazma sırasında kopyalama yaklaşımını kullanın.
Sıkça Sorulan Sorular
“ConcurrentDictionary<T> ve değişmez koleksiyonlar” dersi ücretsiz mi?
Evet — “ConcurrentDictionary<T> ve değişmez koleksiyonlar” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C# Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C# Academy kursu toplamda 3 dersten oluşur.
“ConcurrentDictionary<T> ve değişmez koleksiyonlar” dersinde ne öğreneceğim?
İş parçacığı güvenli güncellemeler için ConcurrentDictionary kullanın; salt okunur görünümleri ve kopyalayarak yazma yaklaşımını içeren basit değişmezlik yöntemlerini öğrenin. C# Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C# Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C# Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 3 dersinin 2. dersidir.
“ConcurrentDictionary<T> ve değişmez koleksiyonlar” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C# Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C# Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- HashSet , SortedSet , Queue , Stack
- ConcurrentDictionary ve değişmez koleksiyonlar
- Eşitlik ve özetleme (değer ve başvuru)