ConcurrentDictionary<T>, koleksi immutable
Gunakan ConcurrentDictionary untuk pembaruan yang aman bagi thread dan pelajari pendekatan immutable sederhana: tampilan hanya-baca dan salin-saat-menulis.
ConcurrentDictionary<T>, koleksi immutable adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 3. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C# Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C# Academy mencakup 3 pelajaran total.
Dasar-dasar keamanan utas dan ketidakberubahan
Hari ini:
- ConcurrentDictionary<TKey,TValue>: pembaruan yang aman dari beberapa utas
- Tampilan hanya-baca vs ketidakberubahan yang sesungguhnya
- Gagasan salin-saat-tulis untuk keamanan sederhana
Operasi atomik: GetOrAdd/AddOrUpdate
Gunakan GetOrAdd dan AddOrUpdate untuk operasi atomik; gunakan TryGetValue untuk membaca dengan aman.
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);
}
}
Gagasan penambahan tanpa kondisi balapan
AddOrUpdate menghindari kondisi balapan baca-ubah-tulis klasik dengan melakukan pembaruan secara atomik.
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)
}
}
Tampilan hanya-baca (bukan tidak berubah)
AsReadOnly mengembalikan tampilan hanya-baca, bukan koleksi yang benar-benar tidak berubah: perubahan pada sumber akan terlihat dalam tampilan.
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
}
}
Cuplikan salin-saat-tulis
Salin-saat-tulis: kembalikan daftar baru untuk perubahan. Pemanggil yang menyimpan daftar lama akan melihat cuplikan keadaan yang stabil.
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
}
}
Kiat dan pertimbangan
Kiat:
- Gunakan ConcurrentDictionary untuk penghitung/tembolok bersama.
- AsReadOnly mencegah perubahan yang tidak disengaja oleh konsumen.
- Untuk tampilan yang stabil, salin daftar sebelum memodifikasinya.
- Koleksi yang benar-benar tidak berubah berada di System.Collections.Immutable (paket); koleksi tersebut tidak digunakan di sini agar kode tetap mandiri.
Pemilihan kamus yang aman untuk utas
Ringkasan
Ringkasan: Gunakan ConcurrentDictionary untuk pembaruan bersamaan. Sediakan tampilan hanya-baca kepada pemanggil, dan gunakan salin-saat-tulis saat memerlukan cuplikan keadaan yang stabil.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “ConcurrentDictionary<T>, koleksi immutable” gratis?
Ya — teks lengkap “ConcurrentDictionary<T>, koleksi immutable” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C# Academy, upgrade ke CoddyKit PRO. Kursus C# Academy mencakup 3 pelajaran total.
Apa yang akan aku pelajari di “ConcurrentDictionary<T>, koleksi immutable”?
Gunakan ConcurrentDictionary untuk pembaruan yang aman bagi thread dan pelajari pendekatan immutable sederhana: tampilan hanya-baca dan salin-saat-menulis. Kamu berlatih C# Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai C# Academy?
Tidak diperlukan pengalaman sebelumnya. C# Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 3.
Berapa lama pelajaran “ConcurrentDictionary<T>, koleksi immutable” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran C# Academy ini?
Ya. Setiap pelajaran C# Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- HashSet , SortedSet , Queue , Stack
- ConcurrentDictionary , koleksi immutable
- Kesetaraan & hashing (nilai vs referensi)