我写了一个程序用于递归计算Fibonacci数,与ConcurrentHashMap
和computeIfAbsent()
方法:
计划工作绝对没问题,当我使用较小的值一样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);
});
}
}
有没有人告诉我,为什么它被永远困?
你在打破僵局。
computeIfAbsent
在ConcurrentHashMap就锁定桶中对应的按键会去。如果您正试图计算斐波那契比在地图桶的数量越高,则递归调用尝试锁定一个已经锁定进一步调用堆栈向上桶。不过,当然,该锁不能被释放,直到所有的递归调用已经完成。因此,您的僵局。
我会重新考虑你的决定使用一个ConcurrentHashMap
在这里。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句