一个ConcurrentHashMap和Fibonacci数 - 不一致的结果

小丑:

我写了一个程序用于递归计算Fibonacci数,与ConcurrentHashMapcomputeIfAbsent()方法:

计划工作绝对没问题,当我使用较小的值一样8,9,10,但卡在无限循环当值从增加的10 to 20 程序从不中断

 public class Test {
    static Map<Integer, Integer> concurrentMap = new ConcurrentHashMap<>();

    public static void main(String[] args) {
        System.out.println("Fibonacci result for 20 is" + fibonacci(20));
    }

    static int fibonacci(int i) {
        if (i == 0)
            return i;

        if (i == 1)
            return 1;

        return concurrentMap.computeIfAbsent(i, (key) -> {
            System.out.println("Value is " + key);
            return fibonacci(i - 2) + fibonacci(i - 1);
        });
    }
}

有没有人告诉我,为什么它被永远困?

乔C:

你在打破僵局。

computeIfAbsent在ConcurrentHashMap就锁定桶中对应的按键会去。如果您正试图计算斐波那契比在地图桶的数量越高,则递归调用尝试锁定一个已经锁定进一步调用堆栈向上桶。不过,当然,该锁不能被释放,直到所有的递归调用已经完成。因此,您的僵局。

我会重新考虑你的决定使用一个ConcurrentHashMap在这里。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章