につながる可能性があります。この例外は、コレクションの内部状態が一貫性がないために発生します。
ConcurrentModificationException
例外を示す例を次に示します:
この例外は、これらの条件の下で発生します:
Exception in thread "main" java.util.ConcurrentModificationException at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:000) at java.base/java.util.ArrayList$Itr.next(ArrayList.java:000) at com.journaldev.ConcurrentModificationException.ConcurrentModificationExceptionExample.main(ConcurrentModificationExceptionExample.java:00)
反復中の変更:iteratorは、同時変更のために設計されていません。
modCount
アルゴリズムこのアルゴリズムは、javaでa をトリガーする方法を示しています:
ConcurrentModificationException
初期化:
ArrayList
ArrayList
の変更:list.iterator()
ArrayList
ConcurrentModificationException
をスローします。
この例外を回避するには、これらのアプローチを使用してください
import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class ConcurrentModificationExample { public static void main(String[] args) { List<Integer> myList = new ArrayList<>(); myList.add(1); myList.add(2); myList.add(3); Iterator<Integer> iterator = myList.iterator(); while (iterator.hasNext()) { Integer value = iterator.next(); System.out.println("Value: " + value); if (value == 2) { myList.remove(value); // Modification during iteration! } } } }
ConcurrentModificationException
:myList.remove(value)
リストをコピーします:
コピーを反復して変更する前に、リストのコピーを作成します。
同時コレクションを使用します:同時修正シナリオの場合、Iterator.remove()
や。iterator.remove()
などのスレッドセーフコレクションを使用
同期ブロック:同期ブロック内で反復と変更を囲み、スレッドの安全性を確保します。
を使用した安全な除去
CopyOnWriteArrayList
ConcurrentHashMap
この改訂されたコードは、例外をスローせずに要素を安全に削除します。 特定のニーズと並行性の要件に基づいて、適切な手法を選択することを忘れないでください。 マルチスレッドシナリオでは、一般に同時コレクションを使用することが推奨されます
以上がJavaでIteratorを使用しながら、ConcurrentModificationExceptionの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。