https://bugs.openjdk.java.net/browse/JDK-8240162
这个 ConcurrentHashMap 的 bug,运行它的用例,会产生一个 bug,就是明明 map 中有映射,但 size 为 0 。
import java.util.concurrent.*;
public class test5 {
public static void main(String[] args) {
final ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>();
final String key = "key";
final String value = "value";
map.put("anotherKey", "anotherValue");
map.put(key, value);
System.out.println("size=" + map.size());
map.computeIfPresent(key, (aKey, aValue) -> {
map.computeIfPresent(key, (bKey, bValue) -> null);
return null;
});
System.out.println("size=" + map.size());//这句返回 0
map.put(key, value);//这句打断点
System.out.println("size=" + map.size());
}
}
可以发现明明 map 中有映射,但 size 为 0 。
运行环境 jdk8
1
amiwrong123 OP 好吧,看错了,不会产生无限递归,不过咋一看这个过程确实有点搞不清楚
|
2
312ybj 2020-07-19 15:30:34 +08:00 via Android
你可以尝试改变 debug 的类型,右击一下短点
|
3
yanshenxian 2020-07-19 17:09:32 +08:00 1
ConcurrentHashMap 的 size 方法本来就是不精确的
这个例子也没有递归操作啊 computeIfPresent 里的 lambda 返回空相当于 remove 这个 key 了,内部操作 count -1 这就相当于操作了两次 -1 最后计算的 size 就是 0 如果换成 HashMap 这里就会抛出 ConcurrentModificationException |
4
no1xsyzy 2020-07-20 13:24:38 +08:00
没有哪个函数调用了自身,只是存在某处回调中再次调用同样的外部函数,你可能把它误看作是的递归了。
|
5
amiwrong123 OP @no1xsyzy
是的,并不是递归 |