Di javadoc untuk ConcurrentHashMap adalah sebagai berikut:
Pengambilan operasi (termasuk get) umumnya tidak memblokir, jadi mungkin tumpang tindih dengan operasi pembaruan (termasuk menempatkan dan menghapus). Pengambilan mencerminkan hasil dari operasi pembaruan yang paling baru selesai diadakan saat onsetnya. Untuk operasi agregat seperti putAll dan clear, pengambilan secara bersamaan dapat mencerminkan penyisipan atau penghapusan hanya beberapa entri. Demikian pula, Iterator dan Enumerasi mengembalikan elemen yang mencerminkan keadaan tabel hash di beberapa titik di atau sejak penciptaan iterator / enumerasi. Mereka tidak membuang ConcurrentModificationException. Namun, iterator dirancang untuk digunakan hanya oleh satu utas pada satu waktu.
Apa artinya? Apa yang terjadi jika saya mencoba untuk mengulangi peta dengan dua utas secara bersamaan? Apa yang terjadi jika saya meletakkan atau menghapus nilai dari peta saat iterasi?
ConcurrentModificationException
waktu iterasiConcurrentHashMap
, kenapa?Anda dapat menggunakan kelas ini untuk menguji dua utas pengakses dan satu memutasi instance bersama dari
ConcurrentHashMap
:Tidak terkecuali akan terlempar.
Berbagi iterator yang sama antara utas pengakses dapat menyebabkan kebuntuan:
Segera setelah Anda mulai berbagi yang sama di
Iterator<Map.Entry<String, String>>
antara accessor dan mutator threadsjava.lang.IllegalStateException
akan mulai bermunculan.sumber
Ini berarti bahwa Anda tidak boleh berbagi objek iterator di antara banyak utas. Membuat banyak iterator dan menggunakannya secara bersamaan di utas terpisah adalah hal yang baik.
sumber
Ini mungkin memberi Anda wawasan yang baik
Mengenai hal ini:
Itu berarti, sementara menggunakan iterator yang dihasilkan oleh ConcurrentHashMap di dua utas aman, itu dapat menyebabkan hasil yang tidak terduga dalam aplikasi.
sumber
Ini berarti Anda tidak boleh mencoba menggunakan iterator yang sama dalam dua utas. Jika Anda memiliki dua utas yang perlu untuk mengulangi kunci, nilai atau entri, maka masing-masing harus membuat dan menggunakan iterator mereka sendiri.
Tidak sepenuhnya jelas apa yang akan terjadi jika Anda melanggar aturan ini. Anda bisa saja mendapatkan perilaku yang membingungkan, dengan cara yang sama seperti yang Anda lakukan jika (misalnya) dua utas mencoba membaca dari input standar tanpa menyinkronkan. Anda juga bisa mendapatkan perilaku yang tidak aman.
Tetapi jika kedua utas menggunakan iterator yang berbeda, Anda harus baik-baik saja.
Itu masalah terpisah, tetapi bagian javadoc yang Anda kutip menjawabnya dengan memadai. Pada dasarnya, iterator aman digunakan, tetapi tidak ditentukan apakah Anda akan melihat efek dari penyisipan, pembaruan, atau penghapusan bersamaan yang tercermin dalam urutan objek yang dikembalikan oleh iterator. Dalam praktiknya, itu mungkin tergantung pada di mana peta pembaruan terjadi.
sumber