Ada dua jenis iterator di Java: fail-safe dan fail-fast.
Apa artinya ini, dan apakah perbedaan di antara keduanya?
java
iterator
terminology
Prateek
sumber
sumber
Jawaban:
"Aman dari kegagalan " ( dalam rekayasa ) berarti bahwa sesuatu gagal dengan cara yang tidak menyebabkan kerusakan atau kerusakan minimal. Sebenarnya, tidak ada hal seperti iterator gagal-aman di Java. Jika sebuah iterator gagal (dalam arti normal "gagal"), Anda dapat mengharapkan terjadinya kerusakan.
Saya menduga bahwa yang Anda maksud sebenarnya adalah iterator yang "kurang konsisten". Javadoc mengatakan:
Biasanya, konsistensi yang lemah berarti bahwa jika kumpulan dimodifikasi secara bersamaan dengan iterasi, jaminan dari apa yang dilihat oleh iterasi lebih lemah. (Detailnya akan ditentukan di setiap kelas koleksi bersamaan javadocs.)
"Fail-fast" ( dalam desain sistem ) berarti bahwa kondisi kegagalan diperiksa secara agresif sehingga kondisi kegagalan (jika memungkinkan 1 ) terdeteksi sebelum terlalu banyak kerusakan yang dapat terjadi. Di Java, iterator gagal-cepat gagal dengan menampilkan
ConcurrentModificationException
.Alternatif untuk "gagal-cepat" dan "konsisten lemah" adalah semantik di mana iterasi gagal secara tak terduga; misalnya terkadang memberikan jawaban yang salah atau memberikan pengecualian yang tidak terduga. (Ini adalah perilaku beberapa implementasi standar
Enumeration
API di versi awal Java.)Tidak. Ini adalah properti dari iterator yang diimplementasikan oleh tipe Collection standar; yaitu "gagal cepat" atau "konsisten lemah" ... bila digunakan dengan benar sehubungan dengan sinkronisasi dan model memori Java 1 .
Iterator cepat gagal biasanya diimplementasikan menggunakan
volatile
penghitung pada objek koleksi.Iterator
dibuat, nilai penghitung saat ini tertanam diIterator
objek.Iterator
operasi dilakukan, metode akan membandingkan dua nilai penghitung dan menampilkan CME jika keduanya berbeda.Sebaliknya, iterator yang kurang konsisten biasanya bersifat ringan dan memanfaatkan properti dari setiap struktur data internal pengumpulan serentak. Tidak ada pola umum. Jika Anda tertarik, baca kode sumber untuk kelas koleksi yang berbeda.
1 - Penunggangnya adalah bahwa perilaku gagal-cepat mengasumsikan bahwa id aplikasi dengan benar sehubungan dengan sinkronisasi dan model memori. Itu berarti bahwa (misalnya) jika Anda mengulang
ArrayList
tanpa sinkronisasi yang tepat, hasilnya mungkin adalah hasil daftar yang rusak. Mekanisme "kegagalan cepat" mungkin akan mendeteksi modifikasi bersamaan (meskipun itu tidak dijamin), tetapi tidak akan mendeteksi kerusakan yang mendasarinya. Sebagai contoh, javadoc forVector.iterator()
mengatakan ini:sumber
setArray
modifikasi apa pun.Mereka adalah tipe yang cepat gagal dan konsisten lemah :
Iterator dari
java.util
pelemparan paketConcurrentModificationException
jika koleksi dimodifikasi oleh metode koleksi (tambah / hapus) saat melakukan iterasiIterator dari
java.util.concurrent
paket biasanya melakukan iterasi melalui snapshot dan memungkinkan modifikasi bersamaan tetapi mungkin tidak mencerminkan pembaruan koleksi setelah iterator dibuat.sumber
Iterator
atauEnumeration
tentukan perilaku sebagai gagal-cepat atau gagal-aman. Ini adalah implementasi khusus (yaitu metode collectioniterator()
/elements()
etc tertentu yang mengembalikan objek-objek ini) yang menentukan perilaku. 2) Implementasi Pencacahan Khas tidak gagal-cepat atau tidak-aman .Satu-satunya perbedaan adalah iterator fail-safe tidak menampilkan Exception apa pun, berbeda dengan Iterator fail-fast.
Jika Collection diubah secara struktural saat satu thread sedang mengulanginya. Ini karena mereka bekerja pada klon Koleksi daripada koleksi asli dan itulah mengapa mereka disebut sebagai iterator gagal-aman.
Iterator dari CopyOnWriteArrayList adalah contoh Iterator yang aman dan juga iterator yang ditulis oleh ConcurrentHashMap keySet juga merupakan iterator yang aman untuk gagal dan tidak pernah memunculkan ConcurrentModificationException di Java.
sumber
Skenario ini berkaitan dengan "pemrosesan bersamaan", artinya lebih dari satu pengguna mengakses sumber daya yang sama. Dalam situasi seperti itu, salah satu pengguna mencoba mengubah sumber daya yang menyebabkan 'ConcurrentProcessingException' karena dalam kasus tersebut pengguna lain mendapatkan data yang tidak benar. Kedua tipe ini berhubungan dengan situasi seperti ini.
Secara sederhana,
Gagal-Cepat:
Gagal-Aman:
sumber