演習課題「CopyOnWriteArraySetを使ってみよう」
現在、右側のコードを実行すると、ConcurrentModificationExceptionというエラーが出力されます。標準入力として配列の要素数、各要素の数値、削除するまでsleep()する秒数が与えられます。CopyOnWriteArraySetを使用してエラーを回避してください。
期待する出力値
1
2
remove
3
#08:並行コレクション3(Set)
このチャプターでは、並行コレクションのSetについて学習します。
新・Java入門編18: コレクションフレームワークを理解しよう(LinkedHashSet)
https://paiza.jp/works/java/new-primer/java-new-primer-18
インタフェースSet
https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/util/Set.html
クラスLinkedHashSet
https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/util/LinkedHashSet.html
クラスCopyOnWriteArrayList
https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/util/concurrent/CopyOnWriteArrayList.html
クラスCopyOnWriteArraySet
https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/util/concurrent/CopyOnWriteArraySet.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 s = new CopyOnWriteArraySet<Integer>();
s.add(0);
s.add(1);
s.add(1);
s.add(2);
new Thread(() -> {
var i = s.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");
s.remove(2);
}
}