obsługują dwa typy iteratorów, pierwszy z nich działa szybko, a drugi jest bezpieczny. Odgrywają one istotną rolę, jeśli chodzi o obsługę wyjątków w Javie. W tym artykule o „Iteratorach odpornych na awarie i bezawaryjnych” przeanalizujemy działanie dwóch iteratorów, a także zasadniczą różnicę między nimi.
Poniżej znajdują się wskazówki, które należy omówić w tym artykule:
Zanim przejdziemy do szczegółowych wyjaśnień, zapoznajmy się z koncepcją jednoczesnej modyfikacji.
Jednoczesna modyfikacja
Gdy pojedynczy wątek (lub wiele wątków) wykonuje iterację w kolekcji, może zmienić strukturę kolekcji, dodając lub usuwając element w kolekcji lub aktualizując wartość elementu w określonej pozycji. Ten proces jest znany jako jednoczesna modyfikacja.
Przyjrzyjmy się szybko dwóm Systemom, które dotyczą powyższego tematu, zanim przejdziemy do szczegółów tego samego,
Fail Fast Sysetm:
System jest oznaczony jako system odporny na awarie, jeśli wyłącza się natychmiast po wystąpieniu błędu. Operacje są natychmiast przerywane, a awarie lub błędy są ujawniane.
System awaryjny:
System jest oznaczony jako system odporny na uszkodzenia, jeśli nadal działa nawet po wystąpieniu usterki lub błędu. Nie przerywają operacji i nie ukrywają błędów, zamiast je ujawniać.
Iteratory w Javie pozwalają nam przechodzić przez obiekty Collection. Iteratory zwracane przez kolekcję są z natury szybkie lub bezpieczne.
Fail Fast Iterator
Szybkie niepowodzenia iteratorów w Javie uniemożliwiają jakiekolwiek modyfikacje strukturalne kolekcji podczas iteracji po niej. Modyfikacja strukturalna obejmuje dodawanie, usuwanie lub aktualizowanie dowolnego elementu w kolekcji podczas iteracji po nim. Iterator zgłasza ConcurrentModificationException, jeśli kolekcja jest strukturalnie zmodyfikowana podczas procesu iteracji.
Należy jednak zauważyć, że jeśli element zostanie usunięty przy użyciu własnej metody iteratorów, tj. Metody remove (), nie zostanie zgłoszony żaden wyjątek. Jest to całkowicie bezpieczny proces. Upewnij się że masz java zainstalowana w systemie
Przykład Fail Fast Iterator:
import java.util.HashMap import java.util.Iterator import java.util.Map public class FailFastExample {public static void main (String [] args) {Map monthIndex = new HashMap () monthIndex.put ('1', 'styczeń ') monthIndex.put (' 2 ',' luty ') monthIndex.put (' 3 ',' marzec ') Iterator iterator = monthIndex.keySet (). iterator () while (iterator.hasNext ()) {System.out .println (monthIndex.get (iterator.next ())) // dodanie elementu do Map // wyjątek zostanie wyrzucony przy następnym wywołaniu // metody next (). monthIndex.put ('4', 'kwiecień')}}}
Wynik:
Wyjątek w wątku „main” java.util.ConcurrentModificationException
w java.util.HashMap $ HashIterator.nextEntry (nieznane źródło)
różnica między przeciążeniem a nadpisywaniem
Teraz przejdźmy dalej i przyjrzyjmy się Fail Safe Iterator,
Fail Safe Iterator
W przeciwieństwie do iteratorów Fail Fast, iteratory Fail Safe nie zgłaszają żadnych wyjątków, jeśli kolekcja zostanie zmodyfikowana podczas procesu iteracji. Wynika to z faktu, że wykonują iterację na klonie kolekcji, a nie na rzeczywistej kolekcji. Zmiany strukturalne dokonane na samej kolekcji pozostają przez nich niezauważone.
Należy jednak zauważyć, że nie ma czegoś takiego jak prawdziwie Fail Safe Iterator. Należałoby nazwać to słabo spójnym. To po prostu oznacza Jeśli Kolekcja jest modyfikowana podczas procesu iteracji, co widzi Iterator jest słabo gwarantowane. To zachowanie różni się dla różnych kolekcji i jest udokumentowane w Javadocs.
Przykład Fail Safe Iterator:
public class FailSafeExample {public static void main (String [] args) {ConcurrentMap monthIndex = new ConcurrentHashMap () monthIndex.put ('1', 'styczeń') monthIndex.put ('2', 'luty') monthIndex.put ( '3', 'March') Iterator iterator = monthIndex.keySet (). Iterator () while (iterator.hasNext ()) {System.out.println (monthIndex.get (iterator.next ())) monthIndex.put ( '4', 'kwiecień')}}}
Wynik:
- styczeń
- luty
- Marsz
Na koniec w tym artykule będziemy porównywać te iteratory,
Różnice: Iterator awaryjny szybki i bezpieczny w przypadku awarii
Poniżej podano podstawowe różnice między dwoma iteratorami:
Parametry | Fail Fast Iterator | Fail Safe Iterator |
Zgłoś wyjątek ConcurrentModification | Tak, rzucają CocurrentModificationExcepti-on, jeśli kolekcja zostanie zmodyfikowana podczas iteracji po niej. | Nie, nie zgłaszają żadnego wyjątku, jeśli kolekcja jest modyfikowana podczas iteracji po niej. |
Sklonuj kolekcję | Nie, używają oryginalnej kolekcji do przechodzenia po żywiołach. | Tak, używają kopii oryginalnej kolekcji do przemierzania. |
Narzut pamięci | Nie, nie wymagają dodatkowej pamięci. | Tak, wymagają dodatkowej pamięci do sklonowania kolekcji. |
Przykłady | HashMap, Vector, ArrayList, HashSet | CopyOnWriteArrayList |
Te iteratory są zarówno unikalne, jak i bardzo potrzebne we wszechstronnym języku java. Chociaż fail safe ma pocieszający pierścień, iterator fail fast okazuje się solidny.
To kończy się w tym artykule. jeśli chcesz dowiedzieć się więcej, sprawdź przez Edureka. Szkolenie i certyfikacja J2EE i SOA firmy Edureka ma na celu zapewnienie Ci przewagi w programowaniu w języku Java i przeszkolenie zarówno w zakresie podstawowych, jak i zaawansowanych koncepcji języka Java, a także różnych struktur Java, takich jak Hibernate i Spring.
Masz do nas pytanie? Wspomnij o tym w sekcji komentarzy na blogu „Szybka awaria vs Bezpieczna”, a my skontaktujemy się z Tobą tak szybko, jak to możliwe.