Bekerja dengan koleksi thread safe: ConcurrentStack dan ConcurrentQueue

Koleksi aman thread pertama kali diperkenalkan di .Net 4 dengan pengenalan namespace System.Collections.Concurrent. Jenis koleksi di namespace System.Collections.Concurrent berisi kumpulan kelas koleksi aman thread.

ConcurrentStack

Tumpukan adalah struktur data yang bekerja pada basis LIFO (terakhir masuk pertama keluar). Kelas ConcurrentStack adalah rekan thread yang aman dari kelas Stack generik. ConcurrentStack adalah kelas koleksi generik aman thread yang pertama kali diperkenalkan sebagai bagian dari .Net Framework 4. Berikut daftar metode penting kelas ini yang menggambarkan kemungkinan operasi.

  1. Push (elemen T) - metode ini digunakan untuk menambahkan data tipe T.
  2. PushRange - metode ini dapat digunakan untuk menambahkan array item berjenis T.
  3. TryPop (out T) - metode ini digunakan untuk mengambil elemen pertama dari tumpukan. Itu mengembalikan benar pada kesuksesan, salah sebaliknya.
  4. TryPeek (out T) - metode ini digunakan untuk mengambil elemen berikutnya dari tumpukan tetapi tidak menghapus elemen dari tumpukan. Perhatikan bahwa mirip dengan metode TryPop (out T), metode ini mengembalikan nilai true pada kesuksesan dan false sebaliknya.
  5. TryPopRange - metode ini kelebihan beban dan bekerja mirip dengan TryPop tetapi digunakan untuk mengambil array dari tumpukan

Berikut cara membuat instance kelas ConcurrentStack dan memasukkan data ke dalamnya.

ConcurrentStack concurrentStack = new ConcurrentStack();

for (Int32 index = 0; index < 10; index++)

{

       concurrentStack.Push(index);

}

Untuk mengambil elemen dari tumpukan bersamaan, Anda dapat memanfaatkan metode TryPop (keluar T) seperti yang ditunjukkan di bawah ini.

Int32 data;

bool success = concurrentStack.TryPop(out data);

Daftar kode berikut menggambarkan cara Anda menyimpan dan mengambil data ke dan dari tumpukan bersamaan.

static void Main(string[] args)

       {

           ConcurrentStack concurrentStack = new ConcurrentStack();

           for (Int32 index = 0; index < 100; index++)

           {

               concurrentStack.Push(index);

           }

           while (concurrentStack.Count > 0)

           {

               Int32 data;

               bool success = concurrentStack.TryPop(out data);

               if (success)

              {

                   Console.WriteLine(data);

               }

           }

           Console.Read();

       }

Saat Anda menjalankan daftar kode di atas, angka 0 hingga 99 akan ditampilkan dalam urutan terbalik di jendela konsol.

ConcurrentQueue

Antrian adalah struktur data yang bekerja berdasarkan FIFO (first in first out). Kelas ConcurrentQueue di .Net bertindak sebagai antrian generik berbasis FIFO yang aman untuk thread.

Berikut ini adalah daftar metode penting di kelas ConcurrentQueue.

  1. Enqueue (elemen T) - metode ini digunakan untuk menambahkan item bertipe T ke antrian
  2. TryPeek (out T) - metode ini digunakan untuk mengambil elemen berikutnya dari antrian tetapi tidak menghapus elemen dari antrian. Metode ini mengembalikan nilai benar saat berhasil dan salah saat gagal.
  3. TryDequeue (out T) - metode ini digunakan untuk mengambil elemen pertama dari antrian. Berlawanan dengan metode TryPeek (out T), metode ini menghapus elemen dari antrean. Metode ini mengembalikan nilai true pada kesuksesan dan false sebaliknya.

Cuplikan kode berikut menunjukkan bagaimana Anda dapat membuat instance kelas ConcurrentQueue untuk menyimpan bilangan bulat.

ConcurrentQueue concurrentQueue = new ConcurrentQueue();

Untuk menyimpan elemen ke instance antrian bersamaan, Anda dapat memanfaatkan metode Enqueue seperti yang ditunjukkan di bawah ini.

concurrentQueue.Enqueue(100);

Daftar kode berikut mengilustrasikan bagaimana Anda bisa menyimpan dan mengambil elemen ke dan dari antrian bersamaan.

ConcurrentQueue concurrentQueue = new ConcurrentQueue();

for (int index = 0; index < 100; index++)

{

     concurrentQueue.Enqueue(index);

}

Int32 item;

while (concurrentQueue.TryDequeue(out item))

{

     Console.WriteLine(item);

}

Saat Anda menjalankan daftar kode di atas, angka 0 hingga 99 akan ditampilkan di jendela konsol.

Perhatikan bahwa kelas ConcurrentStack dan ConcurrentQueue aman untuk thread dan dapat mengelola masalah penguncian dan sinkronisasi secara internal.

Anda juga bisa mengonversi instance antrian serentak ke array dengan membuat panggilan ke metode ToArray (). Potongan kode berikut menggambarkan bagaimana hal ini dapat dicapai.

ConcurrentQueue concurrentQueue = new ConcurrentQueue();

for (Int32 index = 0; index < 100; index++ )

   concurrentQueue.Enqueue(index);

Int32[] integerArray = concurrentQueue.ToArray();

foreach (int i in integerArray)

{

   Console.WriteLine(i);

}

Properti IsEmpty dari kelas ConcurrentQueue mengembalikan nilai true jika koleksi kosong, salah jika tidak. Cuplikan kode berikut menunjukkan bagaimana Anda dapat menggunakan metode ini.

ConcurrentQueue concurrentQueue = new ConcurrentQueue();

for (Int32 index = 0; index < 100; index++ )

concurrentQueue.Enqueue(index);

while(!concurrentQueue.IsEmpty)

{

     Int32 result;

     concurrentQueue.TryDequeue(out result);

     Console.WriteLine(result);

}