跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 感觉 Lambda 加上递归调用,就有点搞不懂运行过程了
未分類
15 7 月 2020

感觉 Lambda 加上递归调用,就有点搞不懂运行过程了

感觉 Lambda 加上递归调用,就有点搞不懂运行过程了

資深大佬 : amiwrong123 6

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());     } } 

感觉 Lambda 加上递归调用,就有点搞不懂运行过程了

可以发现明明 map 中有映射,但 size 为 0 。

  1. 为什么没有产生无限递归,看起来会无限递归啊?感觉调用过程好难理解
  2. 为啥执行完,size 返回错误的值?

运行环境 jdk8

大佬有話說 (5)

  • 主 資深大佬 : amiwrong123

    好吧,看错了,不会产生无限递归,不过咋一看这个过程确实有点搞不清楚

  • 資深大佬 : 312ybj

    你可以尝试改变 debug 的类型,右击一下短点

  • 資深大佬 : yanshenxian

    ConcurrentHashMap 的 size 方法本来就是不精确的
    这个例子也没有递归操作啊 computeIfPresent 里的 lambda 返回空相当于 remove 这个 key 了,内部操作 count -1
    这就相当于操作了两次 -1 最后计算的 size 就是 0

    如果换成 HashMap 这里就会抛出 ConcurrentModificationException

  • 資深大佬 : no1xsyzy

    没有哪个函数调用了自身,只是存在某处回调中再次调用同样的外部函数,你可能把它误看作是的递归了。

  • 主 資深大佬 : amiwrong123

    @no1xsyzy
    是的,并不是递归

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具