ConcurrenthashMap (singkatnya CHM) baru diperkenalkan di Java 1.5 sebagai alternatif untuk hashtable dan merupakan anggota penting dari paket bersamaan. Sebelum Java 1.5, jika Anda ingin mengimplementasikan peta yang dapat digunakan dengan aman dalam program multi-threaded dan bersamaan, Anda hanya dapat memilih dari peta hashtable dan disinkronkan, karena hashmap tidak aman-utas. Tetapi setelah memperkenalkan CHM, kami memiliki pilihan yang lebih baik. CHM tidak hanya aman-utas, tetapi juga berkinerja lebih baik daripada Hashtable dan SynchronizedMap. Dibandingkan dengan Hashtable dan SynchronizedMap, seluruh peta terkunci, dan CHM hanya mengunci beberapa peta. CHM memungkinkan operasi baca bersamaan sambil mempertahankan integritas data selama operasi penulisan melalui kunci sinkron. Kami telah mempelajari dasar -dasar CHM di 5 koleksi bersamaan Java dari JDK 5 dan 6. Di blog ini saya akan memperkenalkan poin -poin berikut:
Implementasi ConcurrenthashMap di Java
CHM memperkenalkan segmentasi dan menyediakan semua fitur yang didukung oleh Hashtable. Di CHM, multithreading didukung untuk membaca peta dan tidak memerlukan pemblokiran. Hal ini disebabkan oleh fakta bahwa CHM membagi peta menjadi bagian yang berbeda, hanya mengunci sebagian saat melakukan operasi pembaruan. Menurut tingkat konkurensi default, peta dibagi menjadi 16 bagian dan dikendalikan oleh kunci yang berbeda. Ini berarti bahwa hingga 16 utas tulis dapat mengoperasikan peta secara bersamaan. Bayangkan saja bahwa dari hanya satu utas yang masuk ke 16 utas menulis yang masuk pada saat yang sama (baca utas hampir tidak terbatas), peningkatan kinerja jelas. Namun, karena beberapa operasi pembaruan, seperti put (), lepas (), putall (), dan clear (), hanya mengunci operasi, operasi pencarian tidak dapat menjamin bahwa hasil terbaru akan dikembalikan.
Poin penting lainnya adalah bahwa ketika iterasi lebih dari CHM, iterator yang dikembalikan oleh Keyset sangat konsisten dan gagal-aman, dan mungkin tidak mengembalikan beberapa perubahan terbaru. Selama traversal, jika konten pada array yang telah dilalui perubahan, pengecualian ConcurrentModificationExceptoin tidak akan dilemparkan.
Tingkat konkurensi default CHM adalah 16, tetapi dapat diubah oleh konstruktor saat membuat CHM. Tidak ada keraguan bahwa tingkat konkurensi mewakili jumlah operasi pembaruan bersamaan, jadi jika hanya beberapa utas yang akan memperbarui peta, disarankan untuk menetapkan tingkat konkurensi yang rendah. Selain itu, CHM juga menggunakan reentrantlock untuk mengunci segmen.
Contoh metode concurrenthashmap putifabsent di java
Sering kali kami ingin memasukkan elemen ketika mereka tidak ada, dan kami biasanya menulis kode seperti berikut
disinkronkan (peta) {if (map.get (key) == null) {return map.put (key, value); } else {return map.get (key); }}Kode di atas mudah digunakan dalam hashmap dan hashtable, tetapi ada risiko kesalahan dalam CHM. Ini karena CHM tidak mengunci seluruh peta selama operasi put, jadi ketika satu utas dimasukkan (k, v), panggilan utas lain dapatkan (k) dan dapatkan nol, yang akan menyebabkan nilai satu utas yang ditimpa oleh nilai dari benang lain. Tentu saja, Anda dapat merangkum kode tersebut ke dalam blok kode yang disinkronkan, yang akan membuat kode Anda satu utas, meskipun aman-aman. Metode putifabsent (kunci, nilai) yang disediakan oleh CHM mengimplementasikan fungsi yang sama secara atom, sambil menghindari risiko persaingan utas di atas.
Kapan Menggunakan Concurrenthashmap
CHM cocok untuk ketika jumlah pembaca melebihi jumlah pembaca, dan ketika jumlah pembaca lebih besar dari atau sama dengan pembaca, kinerja CHM lebih rendah dari peta hashtable dan disinkronkan. Ini karena ketika seluruh peta terkunci, operasi baca menunggu utas yang melakukan operasi tulis ke bagian yang sama untuk berakhir. CHM cocok untuk membuat cache, diinisialisasi pada awal program, dan kemudian dapat diakses oleh beberapa utas yang meminta. Seperti yang dijelaskan Javadoc, CHM adalah alternatif yang baik untuk Hashtable, tetapi ingat bahwa CHM memiliki sinkronisasi yang sedikit lebih sedikit daripada Hashtable.
Meringkaskan
Sekarang kita tahu apa itu concurrenthashmap dan kapan harus menggunakan concurrenthashmap. Mari kita tinjau beberapa poin utama CHM.
Di atas adalah skenario implementasi dan penggunaan CHM di Java, saya harap ini dapat membantu semua orang! Terima kasih atas dukungan Anda untuk situs ini!