Ada dua jenis iterator di Java: fail-safe dan fail-fast.
Apa artinya ini, dan apakah perbedaan di antara keduanya?
Ada dua jenis iterator di Java: fail-safe dan fail-fast.
Apa artinya ini, dan apakah perbedaan di antara keduanya?
Jawaban:
Apa perbedaan di antara mereka ...
"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:
"Sebagian besar implementasi Koleksi serentak (termasuk sebagian besar Antrean) juga berbeda dari konvensi java.util biasa karena Iterator dan Pemisahnya memberikan traversal yang kurang konsisten daripada gagal cepat."
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.)
... dan apakah mereka berbeda dari iterator yang kita gunakan untuk koleksi.
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 di Iterator
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 for Vector.iterator()
mengatakan ini:
"Perilaku cepat-gagal dari sebuah iterator tidak dapat dijamin karena, secara umum, tidak mungkin untuk membuat jaminan keras apa pun dengan adanya modifikasi serentak yang tidak tersinkronisasi. Iterator cepat-gagal
ConcurrentModificationException
melakukan upaya terbaik. Oleh karena itu, itu akan menjadi salah untuk menulis program yang bergantung pada pengecualian ini untuk kebenarannya: perilaku cepat gagal dari iterator harus digunakan hanya untuk mendeteksi bug. "
setArray
modifikasi apa pun.
Mereka adalah tipe yang cepat gagal dan konsisten lemah :
Iterator dari java.util
pelemparan paket ConcurrentModificationException
jika koleksi dimodifikasi oleh metode koleksi (tambah / hapus) saat melakukan iterasi
Iterator dari java.util.concurrent
paket biasanya melakukan iterasi melalui snapshot dan memungkinkan modifikasi bersamaan tetapi mungkin tidak mencerminkan pembaruan koleksi setelah iterator dibuat.
Iterator
atau Enumeration
tentukan perilaku sebagai gagal-cepat atau gagal-aman. Ini adalah implementasi khusus (yaitu metode collection iterator()
/ 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.
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: