Database
 sql >> Teknologi Basis Data >  >> RDS >> Database

Pengantar Concurrent Collection API di Java

API koleksi bersamaan, selain dari Java Collection API, adalah kumpulan API koleksi yang dirancang dan dioptimalkan secara khusus untuk akses multithread yang disinkronkan. Mereka dikelompokkan di bawah java.util.concurrent kemasan. Artikel ini memberikan gambaran umum dan memperkenalkan penggunaannya dengan menggunakan contoh skenario yang sesuai.

Ikhtisar

Java telah mendukung multithreading dan konkurensi sejak awal. Utas dibuat dengan mengimplementasikan Runnable antarmuka atau memperluas Utas kelas. Sinkronisasi dicapai dengan kata kunci yang disebut sinkronisasi . Java juga menyediakan mekanisme komunikasi antar thread. Ini dicapai dengan bantuan notify() dan tunggu() metode, yang merupakan bagian dari Objek kelas. Meskipun teknik multithreading yang inovatif ini merupakan bagian dari beberapa fitur unggulan Java, teknik ini kurang memenuhi kebutuhan programmer yang membutuhkan kemampuan multithreading intensif di luar kotak. Ini karena program bersamaan membutuhkan lebih dari sekadar kemampuan untuk membuat utas dan melakukan beberapa manipulasi dasar. Ini membutuhkan banyak fitur tingkat tinggi seperti kumpulan utas, manajer eksekusi, semafor, dan sebagainya.

Kerangka Koleksi yang Ada

Java sudah memiliki kerangka koleksi lengkap. Koleksinya sangat bagus dalam hal apa yang mereka lakukan dan juga dapat digunakan dalam aplikasi utas Java. Juga, ada kata kunci, yang disebut disinkronkan , untuk membuatnya aman. Meskipun secara dangkal kelihatannya mereka bagus untuk digunakan dalam multithreading, cara keamanan utas dicapai adalah hambatan utama dalam implementasinya secara bersamaan. Terlepas dari sinkronisasi eksplisit, mereka tidak dirancang di bawah paradigma implementasi konkuren sejak awal. Sinkronisasi koleksi ini dicapai dengan membuat serial semua akses ke status koleksi. Ini berarti bahwa, meskipun kita mungkin memiliki beberapa konkurensi, karena pemrosesan serial yang mendasarinya, ia bekerja pada prinsip yang sebenarnya adalah kebalikannya. Serialisasi sangat membebani kinerja, terutama ketika banyak utas bersaing untuk mendapatkan kunci di seluruh koleksi.

API Koleksi Baru

API koleksi serentak adalah tambahan untuk Java dari versi 5 dan merupakan bagian dari paket yang disebut java.util.concurrent . Mereka adalah peningkatan dari API koleksi yang ada dan telah dirancang untuk akses bersamaan dari beberapa utas. Misalnya, ConcurrentHashMap sebenarnya adalah kelas yang kita butuhkan ketika kita ingin menggunakan Peta berbasis hash yang disinkronkan penerapan. Demikian pula, jika kita menginginkan Daftar yang dominan-traversal, thread-safe , kita sebenarnya bisa menggunakan CopyOnWriterArrayList kelas. ConcurrentMap new baru interface menyediakan sejumlah tindakan gabungan di bawah satu metode, seperti putIfPresent , computeIfPresent , ganti , gabung , dan seterusnya. Ada banyak kelas seperti itu yang berada dalam kerangka pengumpulan bersamaan yang baru. Untuk beberapa nama:ArrayBlockingQueue , ConcurrentLinkedDeque , ConcurrentLinkedQueue , ConcurrentSkipListMap , ConcurrentSkipListSet , CopyOnWriteArraySet , DelayQueue , LinkedBlockingDeque , LinkedBlockingQueue , LinkedTransferQueue , PriorityBlockingQueue , Sinkron Antrian , dan lainnya.

Antrian

Jenis koleksi, seperti Antrian dan BlockingQueue , dapat digunakan untuk menahan elemen sementara, menunggu adalah pengambilan dengan cara FIFO untuk diproses. ConcurrentLinkQueue , di sisi lain, adalah antrean FIFO tradisional yang diimplementasikan sebagai antrean thread-safe tanpa batas berdasarkan node yang ditautkan. Antrian Pemblokiran Prioritas adalah antrean pemblokiran tak terbatas yang menggunakan norma pengurutan yang sama dengan PriorityQueue yang tidak bersamaan dan persediaan yang memblokir operasi pengambilan.

Peta

Di kelas koleksi yang lebih lama saat sinkronisasi diterapkan, ia menahan kunci selama durasi setiap operasi. Ada operasi, seperti get metode HashMap atau berisi metode Daftar , yang melibatkan perhitungan rumit di belakang layar saat dipanggil. Misalnya, untuk menemukan elemen tertentu dalam daftar, secara otomatis memanggil sama dengan metode. Metode ini membutuhkan perhitungan tertentu untuk membandingkan setiap elemen dalam daftar; mungkin butuh waktu lama untuk menyelesaikan tugas. Ini lebih buruk dalam koleksi berbasis hash. Jika elemen dalam peta hash tidak terdistribusi secara merata, melintasi daftar panjang dan memanggil yang sama dapat memakan waktu yang sangat lama. Ini menjadi masalah karena dapat memengaruhi kinerja aplikasi secara keseluruhan.

Tidak seperti HashMap , ConcurrentHashMap menggunakan strategi yang berbeda sama sekali. Alih-alih menyediakan kunci umum untuk setiap metode yang disinkronkan, metode ini menggunakan teknik yang disebut pengupasan kunci . Ini adalah solusi yang lebih baik untuk konkurensi dan skalabilitas. Pengupasan kunci menggunakan kunci terpisah untuk ember terpisah. Akibatnya, pertentangan utas dipisahkan dari struktur data yang mendasarinya dan sebagai gantinya dikenakan pada ember. Misalnya, implementasi ConcurrentHashMap menggunakan larik 16 kunci—masing-masing menjaga 1/16 dari keranjang hash; bucket N dilindungi oleh kunci N mod 16… ini mengurangi permintaan untuk setiap kunci yang diberikan sekitar faktor 16. Karena teknik inilah ConcurrentHashMap mendukung setidaknya 16 penulis bersamaan secara default dan lebih banyak lagi dapat diakomodasi sesuai permintaan.

CopyOnWriterArrayList

Ini adalah alternatif yang bagus untuk Daftar yang disinkronkan dan tidak mengharuskan Anda untuk menerapkan mekanisme penguncian selama iterasi. Iterator mempertahankan referensi ke backing array pada awal iterasi dan tidak mengubahnya. Oleh karena itu, diperlukan sinkronisasi singkat untuk mendapatkan isi array. Beberapa utas dapat mengakses koleksi tanpa mengganggu satu sama lain. Bahkan modifikasi dari banyak utas tidak mengalami pertentangan. Ada pasangan set dari daftar larik ini, yang disebut CopyOnWriterSet , yang dapat digunakan untuk mengganti Set . yang disinkronkan pada kebutuhan konkurensi.

Contoh Singkat

Ada banyak kelas dalam koleksi bersamaan. Penggunaannya tidak terlalu sulit bagi siapa pun yang akrab dengan kerangka kerja koleksi yang lebih lama. Demi kelengkapan, berikut adalah contoh untuk memberikan sekilas kegunaannya dalam pemrograman Java.

package org.mano.example;
import java.util.Random;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
public class ProducerConsumerDemo {
   static BlockingQueue<Integer> queue = new
      LinkedBlockingQueue<>(5);
   public static void main(String[] args) throws
         InterruptedException {
      int noOfProducers = 7;
      int noOfConsumers = 9;
      for (inti = 0; i < noOfProducers; i++) {
         new Thread(new Producer(), "PRODUCER").start();
      }
      for (int i = 0; i < noOfConsumers; i++) {
         new Thread(new Consumer(), "CONSUMER").start();
      }
      System.exit(0);
   }
   static class Producer implements Runnable {
      Random random = new Random();
      public void run() {
         try {
            int num = random.nextInt(100);
            queue.put(num);
            System.out.println("Produced: " + num
               + " Queue size : "+ queue.size());
            Thread.sleep(100);
         } catch (InterruptedException ex) {
            System.out.println("Producer is interrupted.");
         }
      }
   }
   static class Consumer implements Runnable {
      public void run() {
         try {
            System.out.println("Consumed: " + queue.take()
               + " Queue size : "+ queue.size());
            Thread.sleep(100);
         } catch (InterruptedException ex) {
            System.out.println("Consumer is interrupted.");
         }
      }
   }
}

Kesimpulan

Mungkin manfaat terbesar menggunakan kelas koleksi bersamaan adalah skalabilitas dan risikonya yang rendah. API koleksi konkuren Java menyediakan berbagai kelas yang dirancang khusus untuk menangani operasi konkuren. Kelas-kelas ini adalah alternatif dari Java Collection Framework dan menyediakan fungsionalitas serupa kecuali dengan dukungan tambahan konkurensi. Oleh karena itu, kurva pembelajaran bagi programmer yang sudah mengetahui tentang Java Collection Framework hampir datar. Kelas didefinisikan dalam paket java.util.concurrent . Di sini, saya telah mencoba memberikan ikhtisar untuk memulai dan menggunakan API koleksi jika diperlukan.

Referensi

  • Dokumentasi Java API
  • Goetz, Brian, dan Tim Peierls. Konkurensi Java dalam Praktek . Pearson, 2013.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Perubahan pada Partisi yang Dapat Ditulis Mungkin Gagal Secara Tak Terduga

  2. Referensi SQL untuk Pemula

  3. Bagaimana cara melakukan pernyataan IF dalam SQL?

  4. WordPress – Di Balik Layar, Bagian 1

  5. Memahami Tipe Data SQL – Yang Perlu Anda Ketahui Tentang Tipe Data SQL