Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Namespace System.Collections.Concurrent mencakup beberapa kelas koleksi yang aman terhadap multithreading dan dapat diskalakan. Beberapa utas dapat dengan aman dan efisien menambahkan atau menghapus item dari koleksi ini, tanpa memerlukan sinkronisasi tambahan dalam kode pengguna. Saat Anda menulis kode baru, gunakan kelas koleksi konkuren untuk memasukkan beberapa utas ke dalam koleksi secara serentak. Jika Anda hanya membaca dari koleksi bersama, gunakan kelas di System.Collections.Generic namespace.
System.Collections dan System.Collections.Generic
Kelas koleksi di namespace System.Collections mencakup ArrayList dan Hashtable. Kelas-kelas ini memberikan beberapa keamanan utas melalui Synchronized properti , yang mengembalikan pembungkus aman utas di sekitar koleksi. Pembungkus bekerja dengan mengunci seluruh koleksi pada setiap operasi tambahkan atau hapus. Oleh karena itu, setiap utas yang mencoba mengakses koleksi harus menunggu gilirannya untuk mengambil satu kunci. Proses ini tidak dapat diskalakan dan dapat menyebabkan penurunan performa yang signifikan untuk koleksi besar. Selain itu, desainnya tidak terlindungi dari kondisi balapan. Untuk informasi selengkapnya, lihat Sinkronisasi di Koleksi Generik.
Kelas koleksi di namespace System.Collections.Generic mencakup List<T> dan Dictionary<TKey,TValue>. Kelas-kelas ini memberikan peningkatan keamanan tipe dan kinerja dibandingkan dengan kelas System.Collections. Namun, System.Collections.Generic kelas tidak menyediakan sinkronisasi utas apa pun; kode pengguna harus menyediakan semua sinkronisasi saat item ditambahkan atau dihapus pada beberapa utas secara bersamaan.
Sebaiknya gunakan kelas koleksi bersamaan di ruang nama System.Collections.Concurrent karena memberikan keamanan tipe serta keamanan utas yang lebih efisien dan lengkap.
Mekanisme penguncian halus dan mekanisme tanpa terkunci
Beberapa jenis koleksi bersamaan menggunakan mekanisme sinkronisasi ringan seperti SpinLock, , SpinWaitSemaphoreSlim, dan CountdownEvent. Jenis sinkronisasi ini biasanya menggunakan pemutaran sibuk untuk periode singkat sebelum menempatkan utas ke dalam keadaan aktif Wait. Ketika waktu tunggu diperkirakan singkat, pemutaran jauh lebih efisien secara komputasi daripada menunggu, yang melibatkan transisi kernel yang mahal. Untuk kelas koleksi yang menggunakan mekanisme spinning, efisiensi ini berarti bahwa beberapa thread dapat menambahkan dan menghapus item dengan kecepatan tinggi. Untuk informasi selengkapnya tentang spinning versus blocking, lihat SpinLock dan SpinWait.
Kelas ConcurrentQueue<T> dan ConcurrentStack<T> tidak menggunakan kunci sama sekali. Sebaliknya, mereka mengandalkan Interlocked operasi untuk mencapai keselamatan thread.
Nota
Karena kelas koleksi bersamaan mendukung ICollection, mereka menyediakan implementasi untuk properti-properti IsSynchronized dan SyncRoot, meskipun properti-properti ini tidak relevan.
IsSynchronized selalu kembali false dan, SyncRoot selalu null (Nothing di Visual Basic).
Tabel berikut ini mencantumkan jenis koleksi di System.Collections.Concurrent namespace:
| Tipe | Deskripsi |
|---|---|
| BlockingCollection<T> | Menyediakan fungsionalitas pembatasan dan pemblokiran untuk semua jenis yang mengimplementasikan IProducerConsumerCollection<T>. Untuk informasi selengkapnya, lihat Gambaran Umum BlockingCollection. |
| ConcurrentDictionary<TKey,TValue> | Implementasi thread-safe dari kamus pasangan kunci-nilai. |
| ConcurrentQueue<T> | Implementasi thread-safe untuk antrean FIFO (first-in, first-out). |
| ConcurrentStack<T> | Implementasi yang aman untuk thread dari tumpukan LIFO (masuk terakhir, keluar pertama). |
| ConcurrentBag<T> | Implementasi thread-safe dari kumpulan elemen yang tidak diurutkan. |
| IProducerConsumerCollection<T> | Antarmuka yang harus diterapkan oleh tipe untuk digunakan dalam BlockingCollection. |
Artikel terkait
| Judul | Deskripsi |
|---|---|
| Gambaran Umum BlockingCollection | Menjelaskan fungsionalitas yang disediakan oleh tipe BlockingCollection<T>. |
| Cara: Menambahkan dan Menghapus Item dari ConcurrentDictionary | Menjelaskan cara menambahkan dan menghapus elemen dari ConcurrentDictionary<TKey,TValue> |
| Cara: Menambahkan dan Mengambil Item Satu Per satu dari BlockingCollection | Menjelaskan cara menambahkan dan mengambil item dari kumpulan pemblokiran tanpa menggunakan enumerator baca-saja. |
| Cara: Menambahkan Fungsionalitas Pembatas dan Pemblokiran ke Koleksi | Menjelaskan cara menggunakan kelas koleksi apa pun sebagai penyimpanan dasar untuk koleksi IProducerConsumerCollection<T>. |
| Cara: Menggunakan ForEach untuk Menghapus Item dalam BlockingCollection | Menjelaskan cara menggunakan foreach (For Each di Visual Basic) untuk menghapus semua item dalam kumpulan pemblokiran. |
| Cara: Menggunakan Koleksi Pemblokiran dalam Array pada Pipa Pemrosesan | Menjelaskan cara menggunakan beberapa koleksi pemblokiran secara bersamaan untuk mengimplementasikan alur. |
| Cara: Membuat Kumpulan Objek dengan Menggunakan ConcurrentBag | Menunjukkan cara menggunakan tas bersamaan untuk meningkatkan performa dalam skenario di mana Anda dapat menggunakan kembali objek alih-alih terus membuat yang baru. |