Seperti Peta kontainer di Java:
for(Orang orang : pList){
if(orang.getGender()==Jenis Kelamin.MALE){
pList.remove(person); //Operasi penghapusan tidak dapat dilakukan selama traversal
}
}
Saat melintasi Peta, biasanya ia memperoleh Kumpulan nilai kuncinya, dan kemudian menggunakan iterator untuk melintasi Peta.
Perhatikan bahwa selama proses traversal, hanya elemen dalam Peta yang dapat diproses sesuai. Elemen Peta tidak dapat ditambahkan atau dikurangi. Dengan kata lain, ukuran Peta tidak dapat diubah, dan akan terjadi pengecualian (tidak dapat digunakan selama proses traversal). proses traversal). memodifikasi, menghapus atau menambahkan elemen dalam peta)
Pengecualian yang dilaporkan adalah pengecualian java.util.ConcurrentModificationException
kelas publik ConcurrentModificationExceptionmemperluas RuntimeException
Pengecualian ini muncul ketika suatu metode mendeteksi modifikasi objek secara bersamaan, tetapi tidak mengizinkan modifikasi tersebut.
Misalnya, saat satu thread melakukan iterasi pada suatu Koleksi, thread lain biasanya tidak diizinkan untuk mengubah Koleksi secara linear. Seringkali dalam kasus ini, hasil dari iterasi tidak jelas. Beberapa implementasi iterator (termasuk semua implementasi koleksi generik yang disediakan oleh JRE) mungkin memilih untuk membuang pengecualian ini jika perilaku ini terdeteksi. Iterator yang melakukan operasi ini disebut iterator cepat gagal karena iterator tersebut gagal sepenuhnya dengan cepat tanpa menimbulkan risiko perilaku sewenang-wenang yang tidak ditentukan di masa mendatang.
Perhatikan bahwa pengecualian ini tidak selalu menunjukkan bahwa objek telah dimodifikasi secara bersamaan oleh thread yang berbeda. Suatu objek dapat memunculkan pengecualian ini jika satu thread mengeluarkan serangkaian pemanggilan metode yang melanggar kontrak objek. Misalnya, jika thread secara langsung memodifikasi koleksi saat melakukan iterasi menggunakan iterator fail-fast, iterator akan membuang pengecualian ini.
Perhatikan bahwa perilaku iterator yang gagal-cepat tidak dijamin karena, secara umum, tidak mungkin untuk membuat jaminan keras tentang apakah modifikasi serentak yang tidak disinkronkan akan terjadi. Operasi cepat gagal menghasilkan ConcurrentModificationException berdasarkan upaya terbaik. Oleh karena itu, merupakan kesalahan untuk menulis program yang mengandalkan pengecualian ini untuk meningkatkan kebenaran operasi tersebut. Pendekatan yang benar adalah: ConcurrentModificationException hanya boleh digunakan untuk mendeteksi bug.
Saat mencoba memodifikasi konten Koleksi/Peta secara langsung saat menggunakan iterator gagal-cepat untuk mengulangi Koleksi atau Peta, pengecualian java.util.ConcurrentModificationException akan dilempar bahkan saat dijalankan di bawah satu thread.
Iterator bekerja di thread terpisah dan memiliki kunci mutex. Setelah Iterator dibuat, tabel indeks tertaut tunggal yang menunjuk ke objek asli akan dibuat. Ketika jumlah objek asli berubah, isi tabel indeks ini tidak akan berubah secara serempak, sehingga ketika penunjuk indeks bergerak mundur, ia tidak bisa. ditemukan untuk mengulangi objek, jadi menurut prinsip fail-fast Iterator akan segera memunculkan pengecualian java.util.ConcurrentModificationException.
Oleh karena itu, Iterator tidak mengizinkan objek yang diiterasi diubah saat sedang berfungsi. Tapi Anda bisa menggunakan metode Iterator sendiri, hapus() untuk menghapus objek. Metode Iterator.remove() akan menghapus objek iterasi saat ini dengan tetap menjaga konsistensi indeks.
Yang menarik adalah jika objek Koleksi/Peta Anda sebenarnya hanya memiliki satu elemen, pengecualian ConcurrentModificationException tidak akan dilempar. Inilah sebabnya mengapa hal ini ditunjukkan dalam javadoc: menulis program yang bergantung pada pengecualian ini karena kebenarannya adalah salah: ConcurrentModificationException harus digunakan hanya untuk mendeteksi bug.