Java'da iki tür yineleyici vardır: fail-safe ve fail-fast.
Bu ne anlama geliyor ve aralarındaki fark nedir?
Java'da iki tür yineleyici vardır: fail-safe ve fail-fast.
Bu ne anlama geliyor ve aralarındaki fark nedir?
Yanıtlar:
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, Enumeration
Java'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 .
Iterator
yaratıldığında, sayacın mevcut değeri Iterator
nesneye gömülür .Iterator
iş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) ArrayList
dü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. "
setArray
herhangi bir değişikliği çağırabiliyoruz .
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.util
paket atma işleminden yineleyicilerConcurrentModificationException
java.util.concurrent
Paketin 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.
Iterator
veya Enumeration
belirtmeyin. 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 .
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.
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:
Arıza Güvenliği: