Java : ConcurrentModificationException (並列処理例外) - API使用例
ConcurrentModificationException (Java SE 19 & JDK 19) の使用例まとめです。
だいたいのメソッドを網羅済みです。
API仕様のおともにどうぞ。
概要
ConcurrentModificationException は、並列処理によって、許可されていない状況でオブジェクトが変更されたときに発生する非チェック例外です。
例えば、ArrayList で反復処理 (for-eachループ文) をしている最中に、別のスレッドからリストに要素を追加すると発生します。
もし反復処理中に別スレッドからの変更を許容したい場合は、並列処理用のコレクションが使えます。
リストだと CopyOnWriteArrayList クラスがあります。
void test(List<Integer> list) throws InterruptedException {
for (int i = 0; i < 5; i++) {
list.add(i);
}
try (final var executor = Executors.newSingleThreadScheduledExecutor()) {
executor.schedule(() -> {
System.out.println("-- add value! --");
list.add(9999);
}, 5, TimeUnit.SECONDS);
try {
for (final var value : list) {
System.out.println("value = " + value);
TimeUnit.SECONDS.sleep(2);
}
} catch (ConcurrentModificationException e) {
System.out.println("ConcurrentModificationException!");
}
}
System.out.println("-- end --");
System.out.println("list = " + list);
}
test(new ArrayList<>());
// 結果
// ↓
//value = 0
//value = 1
//value = 2
//-- add value! --
//ConcurrentModificationException!
//-- end --
//list = [0, 1, 2, 3, 4, 9999]
test(new CopyOnWriteArrayList<>());
// 結果
// ↓
//value = 0
//value = 1
//value = 2
//-- add value! --
//value = 3
//value = 4
//-- end --
//list = [0, 1, 2, 3, 4, 9999]
コンストラクタ
ConcurrentModificationException ()
final var e = new ConcurrentModificationException();
System.out.println(e); // java.util.ConcurrentModificationException
ConcurrentModificationException (String message)
final var e = new ConcurrentModificationException("abcd");
System.out.println(e); // java.util.ConcurrentModificationException: abcd
System.out.println(e.getMessage()); // abcd
ConcurrentModificationException (String message, Throwable cause)
final var cause = new ConcurrentModificationException("XYZ");
final var e = new ConcurrentModificationException("abcd", cause);
System.out.println(e); // java.util.ConcurrentModificationException: abcd
System.out.println(e.getMessage()); // abcd
System.out.println(e.getCause()); // java.util.ConcurrentModificationException: XYZ
System.out.println(e.getCause().getMessage()); // XYZ
ConcurrentModificationException (Throwable cause)
final var cause = new ConcurrentModificationException("XYZ");
final var e = new ConcurrentModificationException(cause);
// java.util.ConcurrentModificationException: java.util.ConcurrentModificationException: XYZ
System.out.println(e);
// java.util.ConcurrentModificationException: XYZ
System.out.println(e.getMessage());
System.out.println(e.getCause()); // java.util.ConcurrentModificationException: XYZ
System.out.println(e.getCause().getMessage()); // XYZ
Throwableで宣言されたメソッド
addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
「Java API 使用例 : Throwable」をご参照ください。
関連記事
- API 使用例
- BlockingQueue (ブロッキング・キュー)
- Callable
- CancellationException
- ConcurrentHashMap.KeySetView (並列処理用セット)
- ConcurrentLinkedDeque (並列処理用・両端キュー)
- ConcurrentLinkedQueue (並列処理用キュー)
- ConcurrentMap (並列処理用マップ)
- ConcurrentSkipListSet (並列処理用セット)
- Condition (同期)
- CopyOnWriteArrayList (並列処理用リスト)
- CopyOnWriteArraySet (並列処理用セット)
- CountDownLatch (同期)
- CyclicBarrier (同期)
- Exchanger (同期)
- Executor
- ExecutorService
- Executors
- Future
- Future.State
- FutureTask
- InterruptedException (割込み例外)
- Lock (同期)
- Object (オブジェクト)
- Runnable
- Semaphore (セマフォ)
- Thread (スレッド)
- ThreadGroup
- ThreadLocal
- TimeUnit