ConcurrentHashMap vs HashMap Tersinkronisasi


148

Apa perbedaan antara menggunakan kelas pembungkus SynchronizedMap,, pada HashMapdan ConcurrentHashMap?

Apakah ini hanya dapat memodifikasi HashMapsementara iterasi ( ConcurrentHashMap)?

Jawaban:


120

Disinkronkan HashMap

  1. Setiap metode disinkronkan menggunakan kunci level objek. Jadi metode get dan taruh di synchMap memperoleh kunci.

  2. Mengunci seluruh koleksi adalah overhead kinerja. Sementara satu utas memegang kunci, tidak ada utas lain yang dapat menggunakan koleksi.

ConcurrentHashMap diperkenalkan di JDK 5.

  1. Tidak ada penguncian di tingkat objek, Penguncian pada granularity yang jauh lebih halus. Untuk a ConcurrentHashMap, kuncinya mungkin berada pada level bucket hashmap.

  2. Efek dari penguncian tingkat yang lebih rendah adalah Anda dapat memiliki pembaca dan penulis bersamaan yang tidak mungkin untuk koleksi yang disinkronkan. Ini mengarah pada skalabilitas yang jauh lebih banyak.

  3. ConcurrentHashMaptidak melempar ConcurrentModificationExceptionjika satu utas mencoba memodifikasinya sementara yang lain mengulanginya.

Artikel ini Java 7: HashMap vs ConcurrentHashMap adalah bacaan yang sangat bagus. Sangat dianjurkan.


7
Jadi apa bedanya antara Hashtabledan Synchronized HashMap?
roottraveller

1
Antara ConcurrentHashMap dan Synchronized HashMap, mana yang Anda rekomendasikan?
Blunderchips

2
Ini perlu menyebutkan bahwa ConcurrentHashMap's size()hasil bisa keluar dari tanggal. size()diizinkan untuk mengembalikan perkiraan alih-alih hitungan yang tepat menurut buku "Java Concurrency in Practice". Jadi metode ini harus digunakan dengan hati-hati.
Andrii Lisun

1
@roottraveller untuk Hashtable dan Sinkronisasi HashMap stackoverflow.com/questions/8875680/…
Narendra Jaggi

89

Jawaban singkatnya:

Kedua peta adalah implementasi Mapantarmuka yang aman. ConcurrentHashMapdiimplementasikan untuk throughput yang lebih tinggi dalam kasus di mana konkurensi tinggi diharapkan.

Artikel Brian Goetz tentang ide di balik ConcurrentHashMapadalah bacaan yang sangat bagus. Sangat dianjurkan.


1
Lalu apa ini? HashMap: Perhatikan bahwa implementasi ini tidak disinkronkan untuk mencegah akses yang tidak disinkronkan secara tidak disengaja ke peta: Map m = Collections.synchronizedMap(new HashMap(...)); docs.oracle.com/javase/7/docs/api/java/util/HashMap.html
X-HuMan

5
"Artikel Brian Goetz ... adalah bacaan yang sangat bagus." - Dan lebih dari itu adalah bukunya "Java Concurrency in Practice".
Alex Fedulov

31

ConcurrentHashMapaman utasnya tanpa menyinkronkan seluruh peta. Membaca dapat terjadi sangat cepat saat menulis dilakukan dengan kunci.


18

Kita dapat mencapai keamanan utas dengan menggunakan ConcurrentHashMap dan sinkronisasiHashmap. Tetapi ada banyak perbedaan jika Anda melihat arsitektur mereka.

  1. sinkronisasiHashmap

Ini akan mempertahankan kunci di tingkat objek. Jadi jika Anda ingin melakukan operasi seperti put / get maka Anda harus mendapatkan kunci terlebih dahulu. Pada saat yang sama, utas lainnya tidak diizinkan untuk melakukan operasi apa pun. Jadi pada suatu waktu, hanya satu utas yang dapat beroperasi pada ini. Jadi waktu tunggu akan meningkat di sini. Kita dapat mengatakan bahwa kinerjanya relatif rendah ketika Anda membandingkan dengan ConcurrentHashMap.

  1. ConcurrentHashMap

Ini akan mempertahankan kunci di tingkat segmen. Ini memiliki 16 segmen dan mempertahankan tingkat concurrency sebagai 16 secara default. Jadi pada suatu waktu, 16 utas dapat dapat beroperasi di ConcurrentHashMap. Selain itu, operasi baca tidak memerlukan kunci. Jadi sejumlah utas dapat melakukan operasi get di atasnya.

Jika thread1 ingin melakukan operasi put di segmen 2 dan thread2 ingin melakukan operasi put di segmen 4 maka diizinkan di sini. Berarti, 16 utas dapat melakukan operasi pembaruan (menaruh / menghapus) pada ConcurrentHashMap sekaligus.

Sehingga waktu tunggu akan lebih sedikit di sini. Oleh karena itu kinerjanya relatif lebih baik daripada sinkronisasi peta.


Penjelasan yang sangat bagus Terima kasih banyak
amoljdv06

11

Keduanya adalah versi HashMap yang disinkronkan, dengan perbedaan dalam fungsi inti dan struktur internal mereka.

ConcurrentHashMap terdiri dari segmen internal yang dapat dilihat sebagai HashMaps independen Secara Konseptual. Semua segmen tersebut dapat dikunci dengan utas terpisah dalam eksekusi bersamaan tinggi. Jadi, banyak utas bisa mendapatkan / menempatkan pasangan nilai kunci dari ConcurrentHashMap tanpa memblokir / menunggu satu sama lain. Ini diterapkan untuk throughput yang lebih tinggi.

sedangkan

Collections.synchronizedMap () , kami mendapatkan versi tersinkronisasi dari HashMap dan diakses dengan cara memblokir. Ini berarti jika beberapa utas mencoba mengakses Peta yang disinkronkan pada saat yang sama, mereka akan diizinkan untuk mendapatkan / menempatkan pasangan nilai kunci satu per satu secara tersinkronisasi.


7

ConcurrentHashMapmenggunakan mekanisme penguncian berbutir halus yang dikenal lock strippinguntuk memungkinkan tingkat akses bersama yang lebih besar. Karena ini memberikan konkurensi dan skalabilitas yang lebih baik .

Juga iterator kembali untuk ConcurrentHashMapyang lemah konsisten bukannya gagal teknik yang cepat digunakan oleh Synchronized HashMap.


3

Metode SynchronizedMapmemegang kunci pada objek, sedangkan di ConcurrentHashMapsana ada konsep "penguncian kunci" di mana kunci disimpan pada ember isinya. Sehingga meningkatkan skalabilitas dan kinerja.


2

ConcurrentHashMap:

1) Kedua peta adalah implementasi antarmuka Map yang aman.

2) ConcurrentHashMap diimplementasikan untuk throughput yang lebih tinggi dalam kasus di mana konkurensi tinggi diharapkan.

3) Tidak ada penguncian di tingkat objek.

Peta Hash Tersinkronisasi:

1) Setiap metode disinkronkan menggunakan kunci level objek.


1

ConcurrentHashMap memungkinkan akses bersamaan ke data. Seluruh peta dibagi menjadi beberapa segmen.

Baca operasi yaitu. get(Object key)tidak disinkronkan bahkan di tingkat segmen.

Tetapi menulis operasi yaitu. remove(Object key), get(Object key)memperoleh kunci di tingkat segmen. Hanya sebagian dari seluruh peta yang dikunci, utas lainnya masih dapat membaca nilai dari berbagai segmen kecuali yang dikunci.

SynchronizedMap di sisi lain, memperoleh kunci di level objek. Semua utas harus menunggu utas saat ini terlepas dari operasi (Baca / Tulis).



1

SynchronizedMapdan ConcurrentHashMapkeduanya kelas benang aman dan dapat digunakan dalam aplikasi multithreaded, perbedaan utama di antara mereka adalah tentang bagaimana mereka mencapai keamanan benang.

SynchronizedMapmemperoleh kunci pada seluruh instance Peta, sementara ConcurrentHashMapmembagi instance Peta menjadi beberapa segmen dan penguncian dilakukan pada mereka.

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini


0

Sesuai java doc's

Hashtable dan Collections.synchronizedMap (HashMap baru ()) disinkronkan. Tapi ConcurrentHashMap adalah "bersamaan".

Kumpulan bersamaan adalah thread-safe, tetapi tidak diatur oleh kunci pengecualian tunggal.

Dalam kasus tertentu ConcurrentHashMap, ia dengan aman mengizinkan sejumlah pembacaan bersamaan sekaligus sejumlah merdu menulis bersamaan. Kelas "Sinkronisasi" dapat berguna ketika Anda harus mencegah semua akses ke koleksi melalui satu kunci, dengan mengorbankan skalabilitas yang lebih buruk.

Dalam kasus lain di mana beberapa utas diharapkan untuk mengakses koleksi umum, versi "bersamaan" biasanya lebih disukai. Dan koleksi yang tidak disinkronkan lebih disukai ketika salah satu koleksi tidak dibagikan, atau hanya dapat diakses saat memegang kunci lain.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.