Pertanyaan Apa yang Iterators gagal-aman & gagal-cepat di Java [tertutup]


Ada dua jenis iterator di Java: fail-safe dan fail-fast.

Apa artinya ini, dan apakah perbedaan di antara mereka?


75
2018-06-29 06:27


asal


Jawaban:


Apa perbedaan di antara mereka ...

"Gagal aman" berarti: itu tidak akan gagal. Sebenarnya, ada mana ada di Jawa sebagai iterator yang gagal aman. Istilah yang benar adalah "konsisten lemah". Javadoc mengatakan:

"Implementasi Kumpulan yang paling bersamaan (termasuk sebagian besar Antrian) juga berbeda dari konvensi java.util yang biasa karena Iterator dan Spliterator mereka menyediakan pelacakan yang konsisten secara konsisten daripada cepat-gagal."

Biasanya, konsistensi yang lemah berarti jika koleksi dimodifikasi secara bersamaan dengan iterasi, jaminan apa yang dilihat oleh iterasi lebih lemah. (Rinciannya akan ditentukan dalam setiap kelas koleksi konkavator javadocs.)

"Gagal cepat" berarti: itu mungkin gagal ... dan kondisi kegagalan diperiksa secara agresif sehingga kondisi kegagalan (jika memungkinkan1) terdeteksi sebelum kerusakan bisa dilakukan. Di Java, iterator gagal-cepat gagal dengan melempar a ConcurrentModificationException.

Alternatif untuk "gagal-cepat" dan "konsisten lemah" adalah semantik di mana iterasi gagal tak terduga; misalnya terkadang memberikan jawaban yang salah atau membuang pengecualian yang benar-benar tidak terduga. (Ini adalah perilaku dari beberapa implementasi standar Enumeration API dalam versi awal Java.)

... dan mereka berbeda dari iterator yang kami gunakan untuk koleksi.

Tidak. Ini properti dari iterator yang diterapkan oleh jenis Koleksi standar; mis. mereka baik "gagal cepat" atau "lemah konsisten" ... ketika digunakan dengan benar sehubungan dengan sinkronisasi dan model memori Java1.


The iterators gagal-cepat khas diimplementasikan menggunakan volatile counter pada objek koleksi.

  • Saat koleksi diperbarui, penghitung bertambah.
  • Ketika sebuah Iterator dibuat, nilai saat ini dari counter tertanam dalam Iterator obyek.
  • Ketika sebuah Iterator operasi dilakukan, metode membandingkan dua nilai counter dan melempar CME jika mereka berbeda.

Implementasi iterator yang gagal aman biasanya ringan. Mereka biasanya bergantung pada properti dari struktur data implementasi daftar spesifik. Tidak ada pola umum. (Baca kode sumber untuk kelas koleksi spesifik yang Anda minati.)


1 - Pengendara adalah bahwa perilaku gagal-cepat mengasumsikan bahwa id aplikasi benar sehubungan dengan sinkronisasi dan model memori. Itu berarti (misalnya) jika Anda mengulangnya ArrayList tanpa sinkronisasi yang tepat, hasil akhirnya bisa menjadi hasil daftar yang rusak. Mekanisme "cepat gagal" mungkin akan mendeteksi modifikasi konkuren (meskipun itu tidak dijamin), tetapi tidak akan mendeteksi korupsi yang mendasarinya. Sebagai contoh, javadoc untuk Vector.iterator() mengatakan ini:

"Perilaku gagal-cepat dari sebuah iterator tidak dapat dijamin karena secara umum, tidak mungkin untuk membuat jaminan keras dengan adanya modifikasi konkuren yang tidak sinkron. Fail-fast iterators throw ConcurrentModificationException atas dasar upaya terbaik. Oleh karena itu, akan salah untuk menulis program yang bergantung pada pengecualian ini untuk kebenarannya: perilaku iterasi yang gagal-cepat harus digunakan hanya untuk mendeteksi bug. "


68
2018-06-29 07:09



Mereka agak gagal-cepat dan lemah konsisten jenis:

Iterator dari java.util lempar paket ConcurrentModificationException jika koleksi dimodifikasi dengan metode pengumpulan (tambahkan / hapus) saat iterasi

Iterator dari java.util.concurrent paket biasanya iterate melalui snapshot dan memungkinkan modifikasi bersamaan tetapi mungkin tidak mencerminkan pembaruan koleksi setelah iterator dibuat.


30
2018-06-29 06:45



Satu-satunya perbedaan adalah iterator yang gagal-aman tidak melempar Exception apa pun, bertentangan dengan Iterator yang gagal-cepat.

Jika Koleksi dimodifikasi secara struktural, sementara satu utas berulang di atasnya. Ini karena mereka bekerja pada kloning Koleksi alih-alih koleksi asli dan itulah sebabnya mereka disebut sebagai iterator yang gagal aman.

Iterator dari CopyOnWriteArrayList adalah contoh Iterator yang aman-gagal dan iterator yang ditulis oleh ConcurrentHashMap keySet juga merupakan iterator yang gagal-aman dan tidak pernah membuang ConcurrentModificationException di Java.


19
2018-06-29 06:31