Failter-Safe Iterator vs Fail-Fast Iterator

1. Úvod

V tomto článku si predstavíme koncept Fail-Fast a Fail-Safe Iterátory.

Systémy Fail-Fast prerušujú prevádzku čo najrýchlejšie, čím okamžite odhaľujú poruchy a zastavujú celú operáciu.

Keďže, Fail-Safe systémy neprerušia operáciu v prípade poruchy. Takéto systémy sa snažia čo najviac zabrániť zvyšovaniu počtu zlyhaní.

2. Rýchlo zlyhať Iterátory

Rýchlo zlyhajúce iterátory v Jave sa pri úprave podkladovej kolekcie nehrajú.

Zbierky udržiavať interné počítadlo tzv modCount. Zakaždým, keď je položka pridaná alebo odstránená z priečinka Zbierka, toto počítadlo sa zvýši.

Pri iterácii na každom Ďalšie() aktuálna hodnota hovoru modCount porovnáva s počiatočnou hodnotou. Ak dôjde k nesúladu, hodí sa ConcurrentModificationException ktorá prerušuje celú operáciu.

Predvolené iterátory pre Zbierky od balík java.util ako napr ArrayList, HashMapatď. sú rýchle.

ArrayList numbers = // ... Iterator iterator = numbers.iterator (); while (iterator.hasNext ()) {Celé číslo = iterator.next (); čísla.pridat (50); }

V útržku kódu vyššie je ConcurrentModificationException vyhodí na začiatku nasledujúceho iteračného cyklu po vykonaní úpravy.

Nie je zaručené, že sa správanie Fail-Fast stane vo všetkých scenároch, pretože je nemožné predpovedať správanie v prípade súbežných úprav. Tieto iterátory hádžu ConcurrentModificationException na základe maximálneho úsilia.

Ak počas iterácie nad a Zbierka, položka je odstránená pomocou Iterátor‘S odstrániť () metóda, ktorá je úplne bezpečná a nevyvoláva výnimku.

Ak však Zbierka‘S odstrániť () metóda sa používa na odstránenie prvku, vyvolá výnimku:

ArrayList numbers = // ... Iterator iterator = numbers.iterator (); while (iterator.hasNext ()) {if (iterator.next () == 30) {iterator.remove (); // ok! }} iterátor = cisla.iterator (); while (iterator.hasNext ()) {if (iterator.next () == 40) {numbers.remove (2); // výnimka}}

3. Iterátory bezpečné proti zlyhaniu

Bezpečné iterátory uprednostňujú nedostatok zlyhaní pred nepríjemnosťou pri spracovaní výnimiek.

Tieto iterátory vytvárajú klon skutočného Zbierka a iterovať to. Ak po vytvorení iterátora dôjde k akejkoľvek zmene, kópia zostane nedotknutá. Preto tieto Iterátory pokračujte v slučkovaní cez Zbierka aj keď je to upravené.

Je však dôležité pamätať na to, že skutočne neexistuje bezpečný iterátor. Správny výraz je slabo konzistentný.

To znamená, AkZbierka je upravený, zatiaľ čo je iterovaný, čo Iterátor vidí je slabo zaručená. Toto správanie sa môže líšiť u rôznych Zbierky a je zdokumentovaný v Javadocs každého z nich Zbierka.

Bezpečné Iterátory mať niekoľko nevýhod. Jednou z nevýhod je, že Iterátor nie je zaručené, že vráti aktualizované údaje z Zbierka, pretože pracuje na klone namiesto skutočného Zbierka.

Ďalšou nevýhodou je réžia vytvárania kópie Zbierka, čo sa týka času aj pamäte.

Iterátory na Zbierky od java.util.concurrent balíček ako napr ConcurrentHashMap, CopyOnWriteArrayList, atď. majú povahu zabezpečenú proti poruchám.

Mapa ConcurrentHashMap = nová ConcurrentHashMap (); map.put ("Prvý", 10); map.put ("Druhý", 20); map.put („Tretí“, 30); map.put ("Štvrtý", 40); Iterátor iterátor = map.keySet (). Iterátor (); while (iterator.hasNext ()) {Reťazcový kľúč = iterator.next (); map.put ("Piaty", 50); }

Vo vyššie uvedenom útržku kódu používame technológiu Fail-Safe Iterátor. Preto aj keď je do prvku pridaný nový prvok Zbierka počas iterácie to nevyvoláva výnimku.

Predvolený iterátorpre ConcurrentHashMap je slabo konzistentný. To znamená, že toto Iterátor dokáže tolerovať súbežné úpravy, prechádza prvkami tak, ako existovali, keď Iterátor bol skonštruovaný a môže (ale nie je zaručené) odrážať úpravy súboru Zbierka po výstavbe Iterátor.

Preto v útržku kódu vyššie iterácia prechádza päťkrát, čo znamená detekuje novo pridaný prvok do priečinka Zbierka.

4. Záver

V tomto tutoriáli sme videli, čo je Fail-Safe a Fail-Fast Iterátory znamená a ako sú tieto implementované v Jave.

Celý kód uvedený v tomto článku je k dispozícii na GitHub.


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