/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
import java.util.concurrent.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
static ConcurrentMap
<String, List
<Integer
>> map
= new ConcurrentHashMap
<>();
map.compute(key, (k, list) -> {
sleepSilently(2000);
if (list == null) {
list = new ArrayList<>();
}
list.add(val);
return list;
});
}
static List
<Integer
> safeGet
(String key
) { List<Integer> list = map.compute(key, (k, l) -> l);
return list
!= null ? Collections.
unmodifiableList(list
) : null; }
public static void main
(String[] args
) { map.
put("A",
new ArrayList
<>(Arrays.
asList(1,
2,
3))); map.
put("B",
new ArrayList
<>(Arrays.
asList(1,
2,
3)));
System.
out.
println("begin add to A"); safeAdd("A", 4);
System.
out.
println("finish add A"); }).start();
sleepSilently(1000);
System.
out.
println("begin get A"); System.
out.
println("A= " + safeGet
("A")); }).start();
sleepSilently(1300);
System.
out.
println("get A unsafely= " + map.
get("A")); }).start();
sleepSilently(1600);
System.
out.
println("begin get B"); System.
out.
println("B= " + safeGet
("B")); }).start();
}
static void sleepSilently(long millis) {
try {
// ignore
}
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CmltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC4qOwoKLyogTmFtZSBvZiB0aGUgY2xhc3MgaGFzIHRvIGJlICJNYWluIiBvbmx5IGlmIHRoZSBjbGFzcyBpcyBwdWJsaWMuICovCmNsYXNzIElkZW9uZQp7CglzdGF0aWMgQ29uY3VycmVudE1hcDxTdHJpbmcsIExpc3Q8SW50ZWdlcj4+IG1hcCA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDw+KCk7CgogICAgc3RhdGljIHZvaWQgc2FmZUFkZChTdHJpbmcga2V5LCBJbnRlZ2VyIHZhbCkgewogICAgICAgIG1hcC5jb21wdXRlKGtleSwgKGssIGxpc3QpIC0+IHsKICAgICAgICAgICAgc2xlZXBTaWxlbnRseSgyMDAwKTsKICAgICAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgbGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxpc3QuYWRkKHZhbCk7CiAgICAgICAgICAgIHJldHVybiBsaXN0OwogICAgICAgIH0pOwogICAgfQoKICAgIHN0YXRpYyBMaXN0PEludGVnZXI+IHNhZmVHZXQoU3RyaW5nIGtleSkgewogICAgICAgIExpc3Q8SW50ZWdlcj4gbGlzdCA9IG1hcC5jb21wdXRlKGtleSwgKGssIGwpIC0+IGwpOwogICAgICAgIHJldHVybiBsaXN0ICE9IG51bGwgPyBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KGxpc3QpIDogbnVsbDsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgbWFwLnB1dCgiQSIsIG5ldyBBcnJheUxpc3Q8PihBcnJheXMuYXNMaXN0KDEsIDIsIDMpKSk7CiAgICAgICAgbWFwLnB1dCgiQiIsIG5ldyBBcnJheUxpc3Q8PihBcnJheXMuYXNMaXN0KDEsIDIsIDMpKSk7CgogICAgICAgIG5ldyBUaHJlYWQoKCkgLT4gewogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGFkZCB0byBBIik7CiAgICAgICAgICAgIHNhZmVBZGQoIkEiLCA0KTsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJmaW5pc2ggYWRkIEEiKTsKICAgICAgICB9KS5zdGFydCgpOwogICAgICAgIG5ldyBUaHJlYWQoKCkgLT4gewogICAgICAgICAgICBzbGVlcFNpbGVudGx5KDEwMDApOwogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGdldCBBIik7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQT0gIiArIHNhZmVHZXQoIkEiKSk7CiAgICAgICAgfSkuc3RhcnQoKTsKICAgICAgICBuZXcgVGhyZWFkKCgpIC0+IHsKICAgICAgICAgICAgc2xlZXBTaWxlbnRseSgxMzAwKTsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJnZXQgQSB1bnNhZmVseT0gIiArIG1hcC5nZXQoIkEiKSk7CiAgICAgICAgfSkuc3RhcnQoKTsKICAgICAgICBuZXcgVGhyZWFkKCgpIC0+IHsKICAgICAgICAgICAgc2xlZXBTaWxlbnRseSgxNjAwKTsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBnZXQgQiIpOwogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkI9ICIgKyBzYWZlR2V0KCJCIikpOwogICAgICAgIH0pLnN0YXJ0KCk7CiAgICB9CgogICAgc3RhdGljIHZvaWQgc2xlZXBTaWxlbnRseShsb25nIG1pbGxpcykgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIFRocmVhZC5zbGVlcChtaWxsaXMpOwogICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgLy8gaWdub3JlCiAgICAgICAgfQogICAgfQp9