2016-08-24 10 views
1

この質問はJDK 1.8.0_74についてです。クラスはjava.util.ArrayList$Itrです。ある人がArrayList#iterator()メソッドを呼び出すと、この(内部)クラスのインスタンスが返されます。 [1]ライン#851でcheckForComodificationコールのために、私はまた、ライン#853ArrayList.Itr#next()はこの行でConcurrentModificationExceptionをスローしますか?

(i >= size)チェック[2]を理解し、私は理論的根拠を理解

850  public E next() { 
851   checkForComodification(); 
852   int i = cursor; 
853   if (i >= size) 
854    throw new NoSuchElementException(); 
855   Object[] elementData = ArrayList.this.elementData; 
856   if (i >= elementData.length) 
857    throw new ConcurrentModificationException(); 
858   cursor = i + 1; 
859   return (E) elementData[lastRet = i]; 
860  } 

:具体的には、私の質問はItrnext()方法についてです

しかし、の856番のチェックが守っている状況は何ですか?シングルスレッドのコードで

、私はいくつかのコードがライン#857にConcurrentModificationExceptionで失敗作ることができないのです。

[1]:イテレータの作成後に構造変更が失敗した:

static void coMod() { 
     ArrayList<Integer> list = new ArrayList<>(4); 
     list.add(1); 
     list.add(2); 
     Iterator<Integer> itr = list.iterator(); 
     list.remove(0); //structural modification after iterator creation 
     if (itr.hasNext()) { 
      System.out.println("wait, there's more!"); 
      itr.next(); // modification while iterating -- 
         // fails at java.util.ArrayList$Itr.next(ArrayList.java:851) 
     } 
    } 

[2]:イテレータは終了

static void noHasNext() { 
    ArrayList<Integer> list = new ArrayList<>(4); 
    Iterator<Integer> itr = list.iterator(); 
    itr.next(); // unguarded next call -- 
       // fails at java.util.ArrayList$Itr.next(ArrayList.java:854) 
} 
+1

"シングルスレッドコード" - ここで重要な要素かもしれません... –

+0

「ArrayList」はスレッドセーフではありません。それでそのチェックをする必要がありますか? –

+0

これはちょうどデバッグ用の小道具です - 実際、Javadocのイントロでは次のように言及しています。https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html –

答えて

0

に達した後に失敗するこれが唯一のマルチに発生する可能性があるものです - スレッド状態。

スレッド1は、855行を実行する直前に停止する必要があると思います。スレッド2は、ArrayList.this.elementDataを新しい(より小さい)配列に設定します。

それ以外の場合にスローされるArrayIndexOutOfBoundsException例外よりも優れた例外を提供するには安価なチェックです。理論的には、オプティマイザは配列境界を明示的にチェックし、ArrayIndexOutOfBoundsExceptionのチェックを省略することさえ可能です。

+0

「これはマルチスレッドの状況でのみ発生する可能性のあること」ではありません。 –

+0

@LewBlochシングルスレッドの状況でどうなるか説明してください。問題は、一般的にではなく、857行目に例外がスローされたときに具体的に質問しています。 checkForComodification()は、変更のための通常の(シングルスレッドの)チェックです。 – Matt

+0

私はその質問を誤解しました。私は訂正した。 –

関連する問題