私は以下のコードを試していました。1つのスレッドでArrayListを変更して別のスレッドで反復している間にConcurrentModificationExceptionをスローしています
public class IteratorFailFastTest {
private List<Integer> list = new ArrayList<>();
public IteratorFailFastTest() {
for (int i = 0; i < 10; i++) {
list.add(i);
}
}
public void runUpdateThread() {
Thread thread2 = new Thread(new Runnable() {
public void run() {
for (int i = 10; i < 20; i++) {
list.add(i);
}
}
});
thread2.start();
}
public void runIteratorThread() {
Thread thread1 = new Thread(new Runnable() {
public void run() {
ListIterator<Integer> iterator = list.listIterator();
while (iterator.hasNext()) {
Integer number = iterator.next();
System.out.println(number);
}
}
});
thread1.start();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
IteratorFailFastTest tester = new IteratorFailFastTest();
tester.runIteratorThread();
tester.runUpdateThread();
}
}
時にはConcurrentModificationExceptionがスローされ、正常に実行されています。
私は理解できないことは、それぞれに1つのスレッドを含む2つの異なるメソッドがあるからです。彼らは一つずつ実行されます。 1つのスレッドがリストの変更を完了すると、スレッド2は反復を開始します。
私はこのリンク(Why no ConcurrentModificationException when one thread iterating (using Iterator) and other thread modifying same copy of non-thread-safe ArrayList)も参照していますが、別のシナリオです。
なぜこの例外がスローされるのですか?それはスレッドのためですか?
誰かが説明できますか?
コード/記事にリンクしないでください。あなたの質問を編集して実際のコード断片を含める。 – Bohemian
@Bohemian:私は投稿を編集しました。 –
CMEは必要ありません。イテレータは作成されていますが使用されていません。 – Bohemian