Iterator Aman-Gagal vs Iterator Gagal-Cepat

1. Perkenalan

Pada artikel ini, kami akan memperkenalkan konsep Iterator Gagal-Cepat dan Aman-Gagal .

Sistem Fail-Fast membatalkan operasi secepat mungkin yang mengekspos kegagalan dengan segera dan menghentikan seluruh operasi.

Padahal, sistem Fail-Safe tidak membatalkan operasi jika terjadi kegagalan. Sistem semacam itu mencoba menghindari peningkatan kegagalan sebanyak mungkin.

2. Iterator Cepat-Gagal

Iterator gagal-cepat di Java tidak berfungsi saat koleksi yang mendasarinya diubah.

Koleksi mempertahankan penghitung internal yang disebut modCount . Setiap kali item ditambahkan atau dihapus dari Koleksi , penghitung ini akan bertambah.

Saat melakukan iterasi, pada setiap panggilan next () , nilai modCount saat ini dibandingkan dengan nilai awal. Jika ada ketidakcocokan, ConcurrentModificationException akan muncul yang membatalkan seluruh operasi.

Iterator default untuk Koleksi dari paket java.util seperti ArrayList , HashMap , dll. Adalah Fail-Fast.

ArrayList numbers = // ... Iterator iterator = numbers.iterator(); while (iterator.hasNext()) { Integer number = iterator.next(); numbers.add(50); }

Dalam cuplikan kode di atas, ConcurrentModificationException dilemparkan pada awal siklus iterasi berikutnya setelah modifikasi dilakukan.

Perilaku Cepat-Gagal tidak dijamin akan terjadi di semua skenario karena tidak mungkin untuk memprediksi perilaku jika terjadi modifikasi bersamaan. Iterator ini membuang ConcurrentModificationException dengan upaya terbaik .

Jika selama iterasi melalui Collection , item dihapus menggunakan Iterator 's hapus () metode, itu sepenuhnya aman dan tidak membuang pengecualian .

Namun, jika Collection 's () menghapus metode yang digunakan untuk menghapus elemen, itu melempar pengecualian:

ArrayList numbers = // ... Iterator iterator = numbers.iterator(); while (iterator.hasNext()) { if (iterator.next() == 30) { iterator.remove(); // ok! } } iterator = numbers.iterator(); while (iterator.hasNext()) { if (iterator.next() == 40) { numbers.remove(2); // exception } }

3. Iterator Aman-Gagal

Iterator Aman-Gagal lebih menyukai kurangnya kegagalan daripada ketidaknyamanan penanganan pengecualian.

Iterator tersebut membuat tiruan dari Collection yang sebenarnya dan mengulanginya. Jika ada modifikasi yang terjadi setelah iterator dibuat, salinannya tetap tidak tersentuh. Karenanya, Iterator ini terus mengulang Koleksi meskipun sudah dimodifikasi.

Namun, penting untuk diingat bahwa tidak ada iterator yang benar-benar Aman-Gagal. Istilah yang benar adalah Konsisten Lemah.

Artinya, jika Koleksi dimodifikasi saat diiterasi, apa yang dilihat Iterator dijamin lemah . Perilaku ini mungkin berbeda untuk Koleksi yang berbeda dan didokumentasikan di Javadocs dari setiap Koleksi tersebut .

Namun, Iterator Aman-Gagal memiliki beberapa kelemahan. Salah satu kelemahannya adalah Iterator tidak dijamin untuk mengembalikan data yang diperbarui dari Collection , karena Iterator bekerja pada klon dan bukan Collection yang sebenarnya .

Kerugian lainnya adalah overhead pembuatan salinan Koleksi , baik mengenai waktu dan memori.

Iterator pada Koleksi dari paket java.util.concurrent seperti ConcurrentHashMap , CopyOnWriteArrayList , dll. Bersifat Fail-Safe.

ConcurrentHashMap map = new ConcurrentHashMap(); map.put("First", 10); map.put("Second", 20); map.put("Third", 30); map.put("Fourth", 40); Iterator iterator = map.keySet().iterator(); while (iterator.hasNext()) { String key = iterator.next(); map.put("Fifth", 50); }

Dalam potongan kode di atas, kami menggunakan Iterator Aman-Gagal . Karenanya, meskipun elemen baru ditambahkan ke Collection selama iterasi, itu tidak memunculkan pengecualian.

Iterator defaultuntuk ConcurrentHashMap tidak konsisten. Artinya, Iterator ini dapat mentolerir modifikasi serentak, melintasi elemen seperti yang ada saat Iterator dibuat dan mungkin (tetapi tidak dijamin) mencerminkan modifikasi Koleksi setelah pembuatan Iterator .

Karenanya, dalam cuplikan kode di atas, iterasi berulang lima kali, yang berarti ia mendeteksi elemen yang baru ditambahkan ke Collection .

4. Kesimpulan

Dalam tutorial ini, kita telah melihat apa yang dimaksud dengan Iterator Gagal-Aman dan Gagal-Cepat dan bagaimana penerapannya di Java.

Kode lengkap yang disajikan dalam artikel ini tersedia di GitHub.