Fail-Safe Iterator vs Fail-Fast Iterator

1. Bemutatkozás

Ebben a cikkben bemutatjuk a Fail-Fast és Fail-Safe fogalmát Iterátorok.

A Fail-Fast rendszerek a lehető leggyorsabban megszakítják a működést, a hibákat azonnal feltárják és az egész műveletet leállítják.

Mivel, A hibabiztos rendszerek meghibásodás esetén nem szakítják meg a műveletet. Az ilyen rendszerek igyekeznek a lehető legnagyobb mértékben elkerülni a kudarcokat.

2. Fail-Fast Iterátorok

A Java sikertelen iterátorai nem játszanak együtt, ha az alapul szolgáló gyűjtemény módosul.

Gyűjtemények úgynevezett belső számláló fenntartása modCount. Minden alkalommal, amikor egy elemet hozzáadnak vagy eltávolítanak a Gyűjtemény, ez a számláló növekszik.

Iteráláskor mindegyiken következő() hívás, a jelenlegi értéke modCount összehasonlítja a kezdeti értékkel. Ha eltérés van, akkor dob ConcurrentModificationException amely megszakítja az egész műveletet.

Alapértelmezett iterátorok a következőhöz: Gyűjtemények tól től java.util csomag mint például Tömb lista, HashMapstb.

ArrayList számok = // ... Iterátor iterátor = számok.iterátor (); while (iterator.hasNext ()) {Egész szám = iterator.next (); számok.add (50); }

A fenti kódrészletben a ConcurrentModificationException A módosítás végrehajtása után a következő iterációs ciklus elején dobódik.

A Fail-Fast viselkedés nem garantáltan fordul elő minden esetben, mivel lehetetlen megjósolni a viselkedést egyidejű módosítások esetén. Ezek az iterátorok dobnak ConcurrentModificationException legjobb erőfeszítés alapján.

Ha az iteráció során a Gyűjtemény, egy elemet eltávolít a Iterátor’S eltávolítás () módszer, ez teljesen biztonságos, és nem vet ki kivételt.

Ha azonban a Gyűjtemény’S eltávolítás () metódust használnak egy elem eltávolítására, kivételt hoz:

ArrayList számok = // ... Iterátor iterátor = számok.iterátor (); while (iterator.hasNext ()) {if (iterator.next () == 30) {iterator.remove (); // rendben! }} iterátor = számok.iterátor (); while (iterator.hasNext ()) {if (iterator.next () == 40) {számok.eltávolítás (2); // kivétel}}

3. Fail-Safe iterátorok

A Fail-Safe iterátorok a kudarcok hiányát részesítik előnyben a kivételkezelés kellemetlenségei helyett.

Ezek az iterátorok létrehozzák a tényleges klónját Gyűjtemény és iterálni rajta. Ha bármilyen változás történik az iterátor létrehozása után, a másolat továbbra is érintetlen marad. Ezért ezek Iterátorok folytassa a hurkolást a Gyűjtemény még ha módosítják is.

Fontos azonban megjegyezni, hogy nincs olyan, hogy valóban kudarcmentes iterátor legyen. A helyes kifejezés gyengén következetes.

Azt jelenti, Ha egyGyűjtemény módosul, miközben iterálják, mi a Iterátor gyengén garantált. Ez a viselkedés különböző lehet Gyűjtemények és minden ilyen Javadocs-ban dokumentálva van Gyűjtemény.

A Fail-Safe Iterátorok van néhány hátránya. Az egyik hátrány, hogy a Iterátor nem garantáltan adja vissza a frissített adatokat a Gyűjtemény, mivel a tényleges helyett a klónon dolgozik Gyűjtemény.

Egy másik hátránya a Gyűjtemény, mind az idő, mind a memória tekintetében.

Iterátorok tovább Gyűjtemények tól től java.util.egyidejű csomag, mint például ConcurrentHashMap, CopyOnWriteArrayListstb. hibabiztos jellegűek.

ConcurrentHashMap map = new ConcurrentHashMap (); map.put ("Első", 10); map.put ("Második", 20); map.put ("Harmadik", 30); map.put ("negyedik", 40); Iterátor iterátor = map.keySet (). Iterator (); while (iterator.hasNext ()) {String kulcs = iterator.next (); map.put ("Ötödik", 50); }

A fenti kódrészletben a Fail-Safe funkciót használjuk Iterátor. Ezért annak ellenére, hogy egy új elem kerül a Gyűjtemény az iteráció során nem vet ki kivételt.

Az alapértelmezett iterátora ConcurrentHashMap gyengén következetes. Ez azt jelenti, hogy ez Iterátor elviseli az egyidejű módosítást, bejárja azokat az elemeket, amelyek akkor léteztek Iterátor készült, és tükrözheti (de nem garantáltan) a Gyűjtemény építése után a Iterátor.

Ezért a fenti kódrészletben az iteráció ötször hurkol, ami azt jelenti észleli az újonnan hozzáadott elemet a Gyűjtemény.

4. Következtetés

Ebben az oktatóanyagban azt láttuk, hogy mi a biztonságos és a gyors Iterátorok és hogyan valósítják meg ezeket a Java-ban.

A cikkben bemutatott teljes kód elérhető a GitHub oldalon.


$config[zx-auto] not found$config[zx-overlay] not found