一部のスレッドがイテレータを使用してコレクションをトラバースしている間にコレクションが変更されると、 iterator.next() がConcurrentModificationExceptionをスローすることを知っています。
ただし、リスト内の要素の数に応じて異なる動作を示します。
for-each ループでリストをトラバースし、そのトラバーサルの間に、リストの remove() メソッドを使用してリストから要素を削除するコード スニペットを試しました。
リストの要素数に依存せずに、この条件で ConcurrentModificationException をスローするのが理想的ですが、リストの要素数が 2 の場合はそうではありません。
ケース 1: リスト内の要素数 - 1
public static void main(String[] args)
{
List<String> list=new ArrayList<String>();
list.add("One");
for (String string : list)
{
System.out.println(string);
list.remove(string);
}
}
出力: 1
スレッド「メイン」での例外 java.util.ConcurrentModificationException
それは予想通りでした。
ケース 2:リスト内の要素数 - 2
public static void main(String[] args)
{
List<String> list=new ArrayList<String>();
list.add("One");
list.add("two");
for (String string : list)
{
System.out.println(string);
list.remove(string);
}
}
出力: 1
例外はスローされません?????????
ケース 3:リスト内の要素数 - 3
public static void main(String[] args)
{
List<String> list=new ArrayList<String>();
list.add("One");
list.add("Two");
list.add("Three");
for (String string : list)
{
System.out.println(string);
list.remove(string);
}
}
出力: 1
スレッド「メイン」での例外 java.util.ConcurrentModificationException
再び例外がスローされますが、これは理想的な動作です。
しかし、 ConcurrentModificationException をスローせずにケース 2で適切に実行されるのはなぜですか。