演習課題「ConcurrentHashMapを使ってみよう」
現在、右側のコードはマルチスレッド環境でスレッドセーフではない操作を実行しており、実行タイミングによってはConcurrentModificationExceptionというエラーが出力される可能性があります。また、標準入力として配列の要素数、各要素の数値(Mapのため2つずつ)、削除するまでsleep()する秒数が与えられています。ConcurrentHashMapを使用してスレッドセーフなHashMapを実装してください。
期待する出力値
1:4
2:3
remove
7:1
8:1
#09:並行コレクション4(Map)
このチャプターでは、並行コレクションのMapについて学習します。
新・Java入門編19: コレクションフレームワークを理解しよう(LinkedHashMap)
https://paiza.jp/works/java/new-primer/java-new-primer-19
インタフェースMap
https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/util/Map.html
クラスHashMap
https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/util/HashMap.html
クラスLinkedHashMap
https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/util/LinkedHashMap.html
インタフェースConcurrentMap
https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/util/concurrent/ConcurrentMap.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 m = new ConcurrentHashMap<Integer, Integer>();
m.put(1, 10);
m.put(2, 20);
m.put(3, 30);
new Thread(() -> {
for (var p : m.entrySet()) {
System.out.println(p.getKey() + ":" + p.getValue());
try {
TimeUnit.MILLISECONDS.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
try {
TimeUnit.MILLISECONDS.sleep(400);
} catch (InterruptedException e) {
}
System.out.println("remove");
m.remove(3);
}
}