フェイルファストイテレータは、スロー 'ConcurrentModificationException'がスローされたときに、基になる構造が変更されていることをどのように知るようになりますか?

Snehal Masne

フェイルファストイテレータは、反復が開始されてからコレクションの構造が変更されたことに気付くとすぐに失敗します。構造の変更とは、1つのスレッドがそのコレクションを反復処理している間に、コレクションから要素を追加、削除、または更新することを意味します。

しかし、どうやって変化を知るようになるのでしょうか?

TechLover

HashMapクラスのソースコードを確認しました。特に「modCount」を検索します。たとえば、プライベートHashIteratorクラスは、インスタンスが作成されてから( 'remove'メソッドを使用する場合を除いて)インスタンスが変更された回数のカウントを保持します。

'nextEntry'メソッドの場合、カウントが変更されたかどうかが確認され、その例外がスローされる可能性があります。'remove'メソッドもカウントをチェックしますが、成功すると、カウントを新しい値にリセットします。これは、「remove」メソッドを使用して、例外を取得せずにエントリを削除できるようにするためです。

他のメソッド(例:「clear」)は「modCount」をインクリメントします。上記のコードの抜粋が示すように、「nextEntry」の次の呼び出しで例外が発生します。

例外がスローされるという保証はありません。

API:

http://docs.oracle.com/javase/7/docs/api/java/util/ConcurrentModificationException.html

一般的に言って、同期されていない同時変更が存在する場合にハード保証を行うことは不可能であるため、フェイルファスト動作は保証できないことに注意してください。フェイルファスト操作は、ベストエフォートベースでConcurrentModificationExceptionをスローします。したがって、その正確性をこの例外に依存するプログラムを作成するのは誤りです。ConcurrentModificationExceptionは、バグを検出するためにのみ使用する必要があります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ