演習課題「CopyOnWriteArrayListを使ってみよう」
現在、右側のコードを実行するとConcurrentModificationExceptionというエラーが出力されます。標準入力として配列の要素数、各要素の数値、削除するインデックス、削除するまでsleep()する秒数が与えられます。CopyOnWriteArrayListを使用してエラーを回避してください。
期待する出力値
1
2
remove
3
#07:並行コレクション2(List)
このチャプターでは、並行コレクションにおけるリストについて学習します。
新・Java入門編09: ArrayListを学習しよう
https://paiza.jp/works/java/new-primer/java-new-primer-9
インタフェースList
https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/util/List.html
インタフェースIterator
https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/util/Iterator.html
クラスArrayList
https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/util/ArrayList.html
クラスCopyOnWriteArrayList
https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/util/concurrent/CopyOnWriteArrayList.html
クラスConcurrentModificationException
https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/util/ConcurrentModificationException.html
import java.util.*;
import java.util.concurrent.*;
public class Main {
public static void main(String... args) {
var l = new CopyOnWriteArrayList<Integer>();
l.add(0);
l.add(1);
l.add(2);
new Thread(() -> {
var i = l.iterator();
while (i.hasNext()) {
System.out.println(i.next());
try {
TimeUnit.MILLISECONDS.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
try {
TimeUnit.MILLISECONDS.sleep(400);
} catch (InterruptedException e) {
}
System.out.println("remove");
l.remove(2);
}
}