Javaコレクションで一般的なcheckForComodification()メソッドは何をするのですか?modCount と expectedModCount の役割?
主にフェイルファスト機構を実装するために使用されます
<ブロッククオート
2つのスレッド(スレッドA、スレッドB)があり、スレッドAはリストのトラバースを担当し、スレッドBはリストを修正します。
-スレッドAは、リストを巡回している途中のある時点(expectedModCount = modCount=Nのとき)から開始され
同時にスレッドBが要素を追加し、modCountの値が変化する(modCount + 1 = N + 1)。スレッド A が次の実行方法を反復し続けるので
通知されたcheckForComodificationメソッドは、expectedModCount = N 、およびmodCount = N + 1、これらは等しくないことを発見します。
これは ConcurrentModificationException 例外を投げるので、結果的にフェイルファスト機構となる。
/**
* Currently fetching code from JDK1.8 ArrayList
*/
/**
* The number of times this list has been <i>structurally modified</i>.
* Structural modifications are those that change the size of the
structural modifications are those that change the size of the * list, or otherwise perturb it in such a fashion that iterations in
Structural modifications are those that change the size of the * list, or otherwise perturb it in such a fashion that iterations in * progress may yield incorrect results.
*
* <p>This field is used by the iterator and list iterator implementation
* returned by the {@code iterator} and {@code listIterator} methods.
* If the value of this field changes unexpectedly, the iterator (or list
* If the value of this field changes unexpectedly, the iterator (or list iterator) will throw a {@code ConcurrentModificationException} in
* response to the {@code next}, {@code remove}, {@code previous},
* This provides
* <i>fail-fast</i> behavior, rather than non-deterministic behavior in
* the face of concurrent modification during iteration.
*
* <p><b> Use of this field by subclasses is optional.</b> If a subclass
* If a subclass wishes to provide fail-fast iterators (and list iterators), then it
* merely has to increment this field in its {@code add(int, E)} and
* {@code remove(int)} methods (and any other methods that it overrides
* that result in structural modifications to the list). A single call to
* {@code add(int, E)} or {@code remove(int)} must add no more than
* one to this field, or the iterators (and list iterators) will throw
* bogus {@code ConcurrentModificationExceptions}. If an implementation
If an implementation * does not wish to provide fail-fast iterators, this field may be
If an implementation * does not wish to provide fail-fast iterators, this field may be * ignored.
*/If an implementation * does not wish to provide fail-fast iterators, this field may be * ignored.
protected transient int modCount = 0;
親クラスAbstractListにint型プロパティが定義されています: modCount
protected transient int modCount = 0;
add(), remove(), addAll(), removeRange(), clear() メソッドを含む、構造の変更を伴う ArrayList のすべてのメソッドに modCount の値を追加します。これらのメソッドが呼ばれるたびに、modCountの値が1ずつ加算されます。
Note: The value of modCount for the add() and addAll() methods is added in the ensureCapacity() method called there.
AbstractList(ArrayListを直接継承)のiterator()メソッドは、内部のプライベートメンバークラスItrを使用して、Itrオブジェクト(Iteratorインターフェース)を返すように生成しています。
public Iterator iterator() { return new Itr(); }
ItrはIterator()インターフェースを実装しており、int型プロパティとしてexpectedModCountを定義しています。このプロパティはItrクラスの初期化時にArrayListオブジェクトのmodCountプロパティの値として与えられます。
int expectedModCount = modCount;
Note: The internal member class Itr is also a member of the ArrayList class, and it has access to all the properties and methods of the AbstractList. Understanding this makes the implementation of the Itr class easy to understand.
public boolean hasNext() { return cursor ! = size; }
Itr.hasNext()メソッド内。
public Object next()
{
try
{
Object next = get(cursor);
checkForComodification();
lastRet = cursor++;
return next;
}
catch(IndexOutOfBoundsException e)
{
checkForComodification();
throw new NoSuchElementException();
}
}
/**
* While performing a drop generation operation on a collection object, there is no restriction on operating on the elements of the collection object
* These operations include some dangerous operations such as add() or remove() that can cause drop generation errors.
* In AbstractList, a simple mechanism is used to circumvent these risks.
* This is where modCount and expectedModCount come into play
*/
final void checkForComodification() {
if (modCount ! = expectedModCount)
throw new ConcurrentModificationException();
}
AbstractListのサイズが呼び出され、現在のカーソル位置が範囲外であるかどうかが比較されます。
public Object next()
{
try
{
Object next = get(cursor);
checkForComodification();
lastRet = cursor++;
return next;
}
catch(IndexOutOfBoundsException e)
{
checkForComodification();
throw new NoSuchElementException();
}
}
/**
* While performing a drop generation operation on a collection object, there is no restriction on operating on the elements of the collection object
* These operations include some dangerous operations such as add() or remove() that can cause drop generation errors.
* In AbstractList, a simple mechanism is used to circumvent these risks.
* This is where modCount and expectedModCount come into play
*/
final void checkForComodification() {
if (modCount ! = expectedModCount)
throw new ConcurrentModificationException();
}
関連
-
eclipse の実行時に java 仮想マシンが見つからなかった
-
[オリジナル】java学習ノート【II】よくあるエラー クラスパス上のクラスファイルが見つからない、またはアクセスできない場合
-
トークンの構文エラー、構成要素の誤配置 エラーの理由
-
Android TextViewの行間解析
-
Spring MVC アノテーションエラーです。引数型[java.lang.String]の名前が利用できません。
-
同期・並行クラスコンテナ
-
エラーです。HttpMessageNotReadableException。JSON のパースエラーです。Unrecognized token 'name': was expecting 'null'.
-
idea Mavenの例外。アーティファクトが見つからない (ネット上の多くの回答は役に立たないか簡潔すぎるため、解決策を見つけるのに長い時間がかかる)
-
Java による木構造データの処理、csv ファイルの操作
-
HttpClient リクエスト DefaultHttpClient 時代遅れの代替品
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
undefinedeclipse エラー。この行に複数のアノテーションが見つかりました: - 文字列を型解決に解決できない
-
宣言されたパッケージ XX は、期待されるパッケージ src.main.java.XX と一致しません。
-
Java面接のポイント3--例外処理(Exception Handling)
-
Java言語プログラミング(基礎編)(第10版)練習問題解答編 第6章
-
SpringBoot ❤ SpringClould共通アノテーションエピックまとめ
-
解決策 VM ソケットに接続できない 非ソケットでの操作: configureBlocking
-
SLF4Jarのパッケージが競合している。クラスパスが複数の SLF4J バインディングを含んでいます。
-
Javaラーニングノート-Collections.singletonListの使用法
-
mvn install でローカルリポジトリにアーティファクトが見つかりませんでした。
-
アーティファクトが見つかりませんでした