HashMap Vs. ConcurrentHashMap Vs. SynchronizedMap – Bagaimana HashMap dapat Disinkronkan di Java

Diterbitkan: 2015-01-29

Crunchify ConcurrentHashMap Vs. Contoh Peta yang Disinkronkan HashMap adalah struktur data yang sangat kuat di Jawa. Kami menggunakannya setiap hari dan hampir di semua aplikasi. Ada beberapa contoh yang telah saya tulis sebelumnya tentang Bagaimana Mengimplementasikan cache Threadsafe, Bagaimana cara mengubah Hashmap ke Arraylist?

Kami menggunakan Hashmap di kedua contoh di atas tetapi itu adalah kasus penggunaan Hashmap yang cukup sederhana. HashMap is a non-synchronized .

Apakah Anda memiliki pertanyaan di bawah ini?

  • Apa perbedaan antara ConcurrentHashMap dan Collections.synchronizedMap(Map)?
  • Apa perbedaan antara ConcurrentHashMap dan Collections.synchronizedMap(Map) dalam hal kinerja?
  • ConcurrentHashMap vs Collections.synchronizedMap()
  • Pertanyaan wawancara HashMap dan ConcurrentHashMap Populer

Dalam tutorial ini kita akan membahas semua pertanyaan di atas dan alasan why and how kita bisa Menyinkronkan Hashmap?

Mengapa?

Objek Peta adalah wadah asosiatif yang menyimpan elemen, dibentuk oleh kombinasi key pengenal unik dan value yang dipetakan . Jika Anda memiliki aplikasi konkuren yang sangat tinggi di mana Anda mungkin ingin mengubah atau membaca nilai kunci di utas yang berbeda, maka sangat ideal untuk menggunakan Hashmap Bersamaan. Contoh terbaik adalah Produsen Konsumen yang menangani baca/tulis secara bersamaan.

Jadi apa yang dimaksud dengan Peta thread-safe? Jika multiple threads mengakses peta hash secara bersamaan, dan setidaknya salah satu utas memodifikasi peta secara struktural, itu must be synchronized externally untuk menghindari tampilan konten yang tidak konsisten.

Bagaimana?

Ada dua cara untuk menyinkronkan HashMap

  1. Metode Java CollectionssynchronousMap()
  2. Gunakan ConcurrentHashMap

PetaHashSerentak

  • Anda harus menggunakan ConcurrentHashMap ketika Anda membutuhkan konkurensi yang sangat tinggi dalam proyek Anda.
  • Ini aman tanpa menyinkronkan whole map .
  • Membaca bisa terjadi sangat cepat saat menulis dilakukan dengan kunci.
  • Tidak ada penguncian di tingkat objek.
  • Penguncian berada pada perincian yang jauh lebih halus pada level bucket hashmap.
  • ConcurrentHashMap tidak melempar ConcurrentModificationException jika satu utas mencoba mengubahnya sementara yang lain mengulanginya.
  • ConcurrentHashMap menggunakan banyak kunci.

DisinkronkanHashMap

  • Sinkronisasi pada level Object.
  • Setiap operasi baca/tulis perlu mendapatkan kunci.
  • Mengunci seluruh koleksi adalah overhead kinerja.
  • Ini pada dasarnya memberikan akses ke hanya satu utas ke seluruh peta & memblokir semua utas lainnya.
  • Ini dapat menyebabkan pertengkaran.
  • SynchronizedHashMap mengembalikan Iterator , yang gagal-cepat pada modifikasi bersamaan.

Sekarang mari kita lihat kodenya

  1. Buat kelas CrunchifyConcurrentHashMapVsSynchronizedHashMap.java
  2. Buat objek untuk setiap HashTable, SynchronizedMap dan CrunchifyConcurrentHashMap
  3. Tambahkan dan ambil 500 ribu entri dari Peta
  4. Ukur waktu mulai dan berakhir dan waktu tampilan dalam milidetik
  5. Kami akan menggunakan ExecutorService untuk menjalankan 5 threads secara paralel

Berikut adalah kode Java:

  • shutdown() berarti layanan pelaksana tidak lagi menerima tugas yang masuk.
  • awaitTermination() dipanggil setelah permintaan shutdown.

Dan karenanya, Anda harus terlebih dahulu mematikan serviceExecutor dan kemudian memblokir dan menunggu utas selesai.

Hasil Konsol Eclipse: