2種類のイテレータをサポートします。1つはフェイルファストで、もう1つはフェイルセーフです。これらは、Javaでの例外処理に関して重要な役割を果たします。 「フェイルファストおよびフェイルセーフイテレータ」に関するこの記事では、2つのイテレータの動作と、それらの本質的な違いを分析します。
この記事で説明するポイントは次のとおりです。
詳細な説明に入る前に、並行変更の概念を理解しましょう。
同時変更
単一のスレッド(または複数のスレッド)がコレクションを反復処理する場合、コレクション内の要素を追加または削除するか、特定の位置で要素の値を更新することにより、コレクションの構造を変更できます。このプロセスは、同時変更と呼ばれます。
同じ詳細に入る前に、上記のトピックに関係する2つのシステムを簡単に見てみましょう。
Fast Sysetmの失敗:
システムは、エラーの発生直後にシャットダウンした場合、フェイルファストシステムとラベル付けされます。操作は即座に中止され、失敗またはエラーが明らかになります。
フェイルセーフシステム:
システムは、障害またはエラーが発生した後も動作し続ける場合、フェイルセーフシステムとラベル付けされます。操作を中止したり、エラーを公開する代わりに非表示にしたりすることはありません。
Javaのイテレータを使用すると、Collectionオブジェクトをトラバースできます。コレクションによって返されるイテレータは、本質的にフェイルファストまたはフェイルセーフのいずれかです。
高速イテレータの失敗
Javaのフェイル・ファスト・イテレーターは、コレクションを反復処理している間、コレクションに対するあらゆるタイプの構造変更を許可しません。構造変更には、コレクション内の要素を繰り返しながら追加、削除、または更新することが含まれます。反復のプロセス中にコレクションが構造的に変更された場合、イテレーターはConcurrentModificationExceptionをスローします。
ただし、イテレータ独自のメソッド、つまりremove()メソッドを使用してアイテムが削除された場合、例外はスローされないことに注意する必要があります。それは完全に安全なプロセスです。あなたが持っていることを確認してください Javaがインストールされています システム上
フェイルファストイテレータの例:
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'、 'January ')monthIndex.put(' 2 '、' February ')monthIndex.put(' 3 '、' March ')Iterator iterator = monthIndex.keySet()。iterator()while(iterator.hasNext()){System.out .println(monthIndex.get(iterator.next()))//マップに要素を追加する//例外は// next()メソッドの次の呼び出しでスローされます。 monthIndex.put( '4'、 'April')}}}
出力:
スレッド「メイン」の例外java.util.ConcurrentModificationException
java.util.HashMapで$ HashIterator.nextEntry(不明なソース)
Javaの例のランダムクラス
それでは、先に進んで、Fail SafeIteratorを見てみましょう。
フェイルセーフイテレータ
フェイルファストイテレータとは異なり、フェイルセーフイテレータは、反復のプロセス中にコレクションが変更された場合でも例外をスローしません。これは、実際のコレクションではなく、コレクションのクローンを反復処理するためです。実際のコレクションで行われた構造上の変更は、彼らには気づかれません。
ただし、真にフェイルセーフなイテレータのようなものはないことに注意してください。それを弱く一貫していると呼ぶのが適切でしょう。これは単にそれを意味します もし コレクションは反復のプロセス中に変更され、イテレーターが認識するものは弱く保証されます。この動作はコレクションごとに異なり、Javadocに記載されています。
フェイルセーフイテレータの例:
public class FailSafeExample {public static void main(String [] args){ConcurrentMap monthIndex = new ConcurrentHashMap()monthIndex.put( '1'、 'January')monthIndex.put( '2'、 'February')monthIndex.put( '3'、 'March')Iterator iterator = monthIndex.keySet()。iterator()while(iterator.hasNext()){System.out.println(monthIndex.get(iterator.next()))monthIndex.put( '4'、 'April')}}}
出力:
- 1月
- 2月
- 行進
最後に、この記事では、これらのイテレータを比較します。
違い:フェイルセーフイテレータとフェイルセーフイテレータ
以下に、2つのイテレータの本質的な違いを示します。
パラメーター | 高速イテレータの失敗 | フェイルセーフイテレータ |
ConcurrentModification例外をスローします | はい、コレクションを反復処理中にコレクションが変更された場合、CocurrentModificationExcepti-onをスローします。 | いいえ、コレクションを繰り返し処理しているときにコレクションが変更されても、例外はスローされません。 |
コレクションのクローンを作成する | いいえ、元のコレクションを使用して要素をトラバースします。 | はい、元のコレクションのコピーを使用してトラバースします。 |
メモリオーバーヘッド | いいえ、追加のメモリは必要ありません。 | はい、コレクションのクローンを作成するには追加のメモリが必要です。 |
例 | HashMap、Vector、ArrayList、HashSet | CopyOnWriteArrayList |
これらのイテレータは、Javaの多用途言語でユニークであり、非常に必要とされています。フェイルセーフには慰めの輪がありますが、フェイルファストイテレータは堅牢であることが証明されています。
これでこの記事は終わりです。詳細を知りたい場合は、 Edurekaによる。 EdurekaのJavaJ2EEおよびSOAトレーニングおよび認定コースは、Javaプログラミングをすぐに開始し、Hibernate&SpringなどのさまざまなJavaフレームワークに加えてコアJavaコンセプトと高度なJavaコンセプトの両方についてトレーニングできるように設計されています。
質問がありますか?この「フェイルファストvsフェイルセーフ」ブログのコメントセクションにその旨を記載してください。できるだけ早くご連絡いたします。