Java'da hata korumalı ve hata hızlı yineleyiciler nelerdir


101

Java'da iki tür yineleyici vardır: fail-safe ve fail-fast.

Bu ne anlama geliyor ve aralarındaki fark nedir?


3
bulduğum en iyi bağlantı javahungry.blogspot.com/2014/04/…
Premraj

2
Java SE belirtimlerinin herhangi bir yineleyiciyi açıklamak için "fail-safe" terimini kullanmadığını unutmayın. Bu nedenle bu terimden kaçınmanızı tavsiye ederim. Ayrıca bkz. Stackoverflow.com/a/38341921/1441122
Stuart Marks

Yanıtlar:


84

Onların arasındaki fark ne ...

"Arıza güvenliği" ( mühendislikte ), bir şeyin hiç veya minimum hasara neden olacak şekilde başarısız olduğu anlamına gelir. Açıkçası böyle bir şey yok Java'da hata korumalı yineleyici diye bir . Yineleyici başarısız olursa (normal anlamda "başarısızlık" anlamında), hasar oluşmasını bekleyebilirsiniz.

Aslında "zayıf tutarlı" yinelemeleri kastettiğinden şüpheleniyorum. Javadoc diyor ki:

"Eşzamanlı Koleksiyon uygulamalarının çoğu (Kuyrukların çoğu dahil), Yineleyicilerinin ve Ayırıcılarının hızlı başarısız geçiş yerine zayıf bir şekilde tutarlı olması açısından olağan java.util kurallarından da farklıdır."

Tipik olarak zayıf tutarlılık, bir koleksiyon bir yinelemeyle eşzamanlı olarak değiştirilirse, yinelemenin gördüklerinin garantilerinin zayıf olduğu anlamına gelir. (Ayrıntılar her javadocs eşzamanlı koleksiyon sınıfında belirtilecektir.)

"Arıza-hızlı" ( sistem tasarımında ), çok fazla hasar yapılmadan önce arıza koşulunun (mümkünse 1 ) tespit edilmesi için arıza durumunun agresif bir şekilde kontrol edilmesi anlamına gelir . Java'da, hata hızlı yineleyici bir ConcurrentModificationException.

"Hızlı başarısızlık" ve "zayıf tutarlılık" ın alternatifi, yinelemenin öngörülemeyen bir şekilde başarısız olduğu anlambilimseldir; örneğin bazen yanlış cevap vermek veya beklenmedik bir istisna yapmak. (Bu, EnumerationJava'nın eski sürümlerindeki bazı standart API uygulamalarının davranışıydı .)

... ve koleksiyon için kullandığımız yineleyiciden farklılar.

Hayır. Bunlar, standart Koleksiyon türleri tarafından uygulanan yineleyicilerin özellikleridir ; Senkronizasyon açısından ve Java bellek modeli ile doğru kullanıldığında yani onlar ... "Hızlı başarısız" veya "zayıf tutarlı" ya olan 1 .


Hataya dayanıklı yineleyiciler, genelliklevolatile koleksiyon nesnesinde bir sayaç kullanılarak uygulanır .

  • Koleksiyon güncellendiğinde, sayaç artar.
  • Bir Iteratoryaratıldığında, sayacın mevcut değeri Iteratornesneye gömülür .
  • Bir Iteratorişlem gerçekleştirildiğinde, yöntem iki sayaç değerini karşılaştırır ve farklılarsa bir CME atar.

Aksine, zayıf tutarlı yineleyiciler tipik olarak hafiftir ve her eşzamanlı koleksiyonun dahili veri yapılarının özelliklerini kullanır. Genel bir model yok. İlgileniyorsanız, farklı koleksiyon sınıfları için kaynak kodunu okuyun.


1 - Sürücü, hızlı hata davranışının, uygulama kimliğinin senkronizasyon ve bellek modeli açısından doğru olduğunu varsaymasıdır. Bu, (örneğin) ArrayListdüzgün senkronizasyon olmadan bir yineleme yaparsanız , sonucun bozuk bir liste sonucu olabileceği anlamına gelir. "Hızlı başarısızlık" mekanizması muhtemelen eşzamanlı değişikliği algılayacaktır (bunun garanti edilmemesine rağmen), ancak temeldeki bozulmayı algılamayacaktır. Örnek olarak, javadoc for şunu Vector.iterator()söylüyor:

"Eşzamanlı olmayan eşzamanlı değişiklik varlığında herhangi bir kesin garantinin verilmesi imkansız olduğundan, bir yineleyicinin başarısız olma hızı davranışı garanti edilemez. Başarısız yineleyiciler ConcurrentModificationException, en iyi çaba temelinde atarlar . Bu nedenle, bu olacaktır. Doğruluğu için bu istisnaya dayanan bir program yazmak yanlıştır: yineleyicilerin başarısızlık hızlı davranışı yalnızca hataları tespit etmek için kullanılmalıdır. "


Belki biraz alakasız ama aynı zamanda bu soru için tamamlayıcı olabilir. Örneğin CoW tarafından kullanılan anlık görüntü stili ne olacak? Daha spesifik olarak, CoW yineleyicinin üzerinde yinelediği temeldeki dizinin (veya anlık görüntünün) diğer evreler tarafından yapılan değişiklikleri nasıl "asla" görmediğini tam olarak anlayamıyorum, çünkü hala setArrayherhangi bir değişikliği çağırabiliyoruz .
stdout

Zayıf bir şekilde tutarlı yineleyicilerin uygulanması hakkında konuşmanın bu Soru-Cevap'ın kapsamı dışında olduğuna karar verdim.
Stephen C

42

Oldukça hızlı başarısız ve zayıf tutarlı türlerdir:

Koleksiyon yineleme sırasında koleksiyonun yöntemleri (ekle / kaldır) tarafından değiştirildiyse java.utilpaket atma işleminden yineleyicilerConcurrentModificationException

java.util.concurrentPaketin yineleyicileri, genellikle bir anlık görüntü üzerinde yineler ve eşzamanlı değişikliklere izin verir, ancak yineleyici oluşturulduktan sonra koleksiyon güncellemelerini yansıtmayabilir.


Yineleyici, numaralandırma güvenliyken başarısız hızlı örneğidir
Ajay Sharma

5
@AjaySharma - İki açıdan yanlış. 1) Davranışı arıza hızlı veya arıza korumalı olarak belirtmeyin Iteratorveya Enumerationbelirtmeyin. Davranışı belirleyen , belirli uygulamalardır (yani, bu nesneleri döndüren belirli toplama iterator()/ elements()vb yöntemleri). 2) Tipik Numaralandırma uygulamaları ne başarısızlık-hızlı ne de arızaya karşı emniyetlidir .
Stephen C

22

Tek fark, arıza korumalı yineleyicinin, başarısız hızlı yineleyicinin aksine herhangi bir İstisna oluşturmamasıdır.

Bir iş parçacığı üzerinde yinelenirken Koleksiyon yapısal olarak değiştirilirse. Bunun nedeni, orijinal koleksiyon yerine Koleksiyonun klonu üzerinde çalışmaları ve bu nedenle de hata korumalı yineleyici olarak adlandırılmalarıdır.

CopyOnWriteArrayList Yineleyicisi, hata korumalı Yineleyicinin bir örneğidir, aynı zamanda ConcurrentHashMap keySet tarafından yazılan yineleyici de hata korumalı yineleyicidir ve Java'da ConcurrentModificationException oluşturmaz.


ConcurrentHashMap yineleyicisinin clone () üzerinde çalıştığını görmüyorum .. :( Bazı zamanlar yineleme yaparken bazı güncellemeleri yansıtır ..
Kanagavelu Sugumar

0

Bu senaryo "eşzamanlı işlem" ile ilgilidir, yani birden fazla kullanıcının aynı kaynağa erişmesi anlamına gelir. Böyle bir durumda, kullanıcılardan biri o kaynağı değiştirmeye çalışır, bu da 'ConcurrentProcessingException'a neden olur çünkü bu durumda diğer kullanıcılar uygun olmayan veriler alır. Her iki tür de bu tür durumlarla ilgilidir.

Basit anlamda,

Başarısızlık:

  • Yineleyiciler, yapısal değişiklik (ekleme, güncelleme, silme) olursa hemen ConcurrentModificationException oluşturur.
  • Örnek: ArrayList, HashMap, TreeSet

Arıza Güvenliği:

  • Burada Yineleyiciler, koleksiyonun orijinal kopyası üzerinde değil, koleksiyonun klonu üzerinde çalıştıkları için herhangi bir istisna atmazlar. Böylece, hata korumalı yineleyicilerdir.
  • Örnek: CopyOnWriteArrayList, ConcurrentHashMap
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.