Koleksi Aman Alur

.NET Framework 4 memperkenalkan namespace System.Collections.Concurrent yang mencakup beberapa kelas koleksi scalable dan aman alur. 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 bersamaan setiap kali beberapa alur akan menulis ke koleksi secara bersamaan. Jika Anda hanya membaca dari koleksi bersama, Anda dapat menggunakan kelas di namespace layanan System.Collections.Generic. Sebaiknya jangan gunakan kelas koleksi 1.0 kecuali Anda diminta untuk menargetkan runtime .NET Framework 1.1 atau yang lebih lama.

Sinkronisasi Alur di Koleksi .NET Framework 1.0 dan 2.0

Koleksi yang diperkenalkan dalam .NET Framework 1.0 ditemukan di namespace layanan System.Collections. Koleksi-koleksi ini, yang mencakup ArrayList dan Hashtable yang umum digunakan, memberikan beberapa keamanan alur melalui properti Synchronized, yang mengembalikan pembungkus alur aman di sekitar koleksi. Pembungkus bekerja dengan mengunci seluruh koleksi pada setiap operasi penambahan atau penghapusan. Oleh karena itu, setiap alur yang mencoba mengakses koleksi harus menunggu gilirannya untuk mengambil satu kunci. Proses ini tidak scalable dan dapat menyebabkan degradasi kinerja yang signifikan untuk koleksi besar. Rancangannya juga tidak sepenuhnya dilindungi dari kondisi race. Untuk mengetahui informasi selengkapnya, lihat Sinkronisasi dalam Koleksi Generik.

Kelas koleksi yang diperkenalkan di .NET Framework 2.0 ditemukan di namespace layanan System.Collections.Generic. Ini termasuk List<T>, Dictionary<TKey,TValue>, dan sebagainya. Kelas-kelas ini memberikan peningkatan keamanan jenis dan performa dibandingkan dengan kelas .NET Framework 1.0. Namun, kelas pengumpulan .NET Framework 2.0 tidak memberikan sinkronisasi alur; kode pengguna harus menyediakan semua sinkronisasi saat item ditambahkan atau dihapus pada beberapa alur secara bersamaan.

Kami merekomendasikan kelas koleksi bersamaan di .NET Framework 4 karena tidak hanya menyediakan keamanan jenis kelas koleksi .NET Framework 2.0, tetapi juga keamanan alur yang lebih efisien dan lebih lengkap daripada yang disediakan oleh koleksi .NET Framework 1.0.

Mekanisme Penguncian Mendetail dan Bebas Kunci

Beberapa jenis koleksi bersamaan menggunakan mekanisme sinkronisasi ringan seperti SpinLock, SpinWait, SemaphoreSlim, dan CountdownEvent, yang baru di .NET Framework 4. Jenis sinkronisasi ini biasanya menggunakan pemutaran yang sibuk untuk periode singkat sebelum mengubah utas ke status Tunggu yang sebenarnya. Ketika waktu tunggu diperkirakan akan sangat singkat, pemutaran akan jauh lebih murah secara komputasi daripada menunggu, yang melibatkan transisi kernel yang mahal. Untuk kelas koleksi yang menggunakan pemutaran, efisiensi ini berarti bahwa beberapa alur dapat menambahkan dan menghapus item pada kecepatan yang sangat tinggi. Untuk mengetahui informasi selengkapnya pemutaran vs. pemblokiran, lihat SpinLock dan SpinWait.

Kelas ConcurrentQueue<T> dan ConcurrentStack<T> tidak menggunakan kunci sama sekali. Sebaliknya, keduanya mengandalkan operasi Interlocked untuk mendapatkan keamanan alur.

Catatan

Karena kelas koleksi bersamaan mendukung ICollection, kelas tersebut menyediakan implementasi untuk properti IsSynchronized dan SyncRoot, meskipun properti ini tidak relevan. IsSynchronized selalu mengembalikan false dan SyncRoot selalu null (Nothing di Visual Basic).

Tabel berikut ini mencantumkan jenis koleksi di namespace layanan System.Collections.Concurrent.

Jenis Deskripsi
BlockingCollection<T> Menyediakan fungsionalitas pembatas dan pemblokiran untuk semua jenis yang mengimplementasikan IProducerConsumerCollection<T>. Untuk mengetahui informasi selengkapnya, lihat Gambaran Umum BlockingCollection.
ConcurrentDictionary<TKey,TValue> Implementasi alur aman dari kamus pasangan nilai kunci.
ConcurrentQueue<T> Implementasi alur aman dari antrean FIFO (masuk pertama, keluar pertama).
ConcurrentStack<T> Implementasi alur aman dari tumpukan LIFO (masuk terakhir, keluar pertama).
ConcurrentBag<T> Implementasi alur aman dari koleksi tanpa urutan elemen.
IProducerConsumerCollection<T> Antarmuka yang harus diterapkan jenis untuk digunakan dalam BlockingCollection.
Judul Deskripsi
Gambaran Umum BlockingCollection Menjelaskan fungsionalitas yang disediakan oleh jenis BlockingCollection<T>.
Petunjuk: Menambah dan Menghapus Item dari ConcurrentDictionary Menjelaskan cara menambahkan dan menghapus elemen dari ConcurrentDictionary<TKey,TValue>
Petunjuk: Menambahkan dan Mengambil Item Satu Per Satu dari BlockingCollection Menjelaskan cara menambahkan dan mengambil item dari koleksi pemblokiran tanpa menggunakan pencacah baca-saja.
Petunjuk: Menambahkan Fungsionalitas Pembatas dan Pemblokiran ke Koleksi Menjelaskan cara menggunakan kelas koleksi apa pun sebagai mekanisme penyimpanan yang mendasari untuk koleksi IProducerConsumerCollection<T>.
Petunjuk: Menggunakan ForEach untuk Menghapus Item di BlockingCollection Menjelaskan cara menggunakan foreach, (For Each di Visual Basic) untuk menghapus semua item dalam koleksi pemblokiran.
Petunjuk: Menggunakan Larik Pemblokiran Koleksi dalam Alur Menjelaskan cara menggunakan beberapa koleksi pemblokiran secara bersamaan untuk mengimplementasikan alur.
Petunjuk: Membuat Kumpulan Objek dengan Menggunakan ConcurrentBag Menunjukkan cara menggunakan ConcurrentBag untuk meningkatkan performa dalam skenario ketika Anda dapat menggunakan kembali objek alih-alih terus membuat objek baru.

Referensi

System.Collections.Concurrent