Java 同時変更例外 (ConcurrentModificationException) を解決する方法
Java プログラミングでは、複数のスレッドが同時にコレクションの読み書きを行うと、例外が発生しやすくなります。同時変更例外 (ConcurrentModificationException)。この例外は通常、他のスレッドがコレクションを変更しているときに、反復子を使用してコレクションを走査するときに発生します。この記事では、この例外を解決するための一般的な方法をいくつか紹介し、対応するコード例を示します。
Java には、java.util.concurrent.CopyOnWriteArrayList
and# など、いくつかのスレッドセーフなコレクション クラスが用意されています。 ##java.util.concurrent.ConcurrentHashMap。これらのコレクション クラスは、特別なコピーオンライト メカニズムを使用して、トラバーサル プロセス中に変更操作が実行されるときに同時変更例外が発生しないようにします。
CopyOnWriteArrayList を使用したサンプル コードを次に示します。
List<String> list = new CopyOnWriteArrayList<>(); list.add("hello"); list.add("world"); Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { String element = iterator.next(); System.out.println(element); list.add("!"); }
List<String> list = new ArrayList<>(); list.add("hello"); list.add("world"); synchronized (list) { Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { String element = iterator.next(); System.out.println(element); list.add("!"); } }
ConcurrentHashMap を使用したサンプル コードです。
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>(); map.put("java", 1); map.put("python", 2); Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry<String, Integer> entry = iterator.next(); String key = entry.getKey(); int value = entry.getValue(); System.out.println(key + ": " + value); map.put("c++", 3); }
Iterator の
remove() メソッドを使用すると、同時変更例外を発生させずに要素を安全に削除できます。以下は、
remove() メソッドを使用したサンプル コードです:
List<String> list = new ArrayList<>(); list.add("hello"); list.add("world"); Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { String element = iterator.next(); System.out.println(element); if (element.equals("hello")) { iterator.remove(); } }
Iterator の削除メソッドを使用すると、同時変更例外の発生を効果的に回避できます。開発プロセス中に、特定のニーズに応じてコレクションへの同時アクセスの問題に対処する適切な方法を選択することで、プログラムの安定性と正確性を確保できます。
以上がJava同時変更例外(ConcurrentModificationException)を解決するメソッドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。