static class ComputeFibonacciTask extends RecursiveTask<Long> {
private final long n;
public ComputeFibonacciTask(long n) {
this.n = n;
}
protected Long compute() {
if (n <= 1) {
return n;
} else {
RecursiveTask<Long> otherTask = new ComputeFibonacciTask(n - 1);
otherTask.fork();
Long right = new ComputeFibonacciTask(n - 2).compute();
return right + otherTask.join();
}
}
}
直接 1000 使用默认的 ForkJoinPool 构造方法, 可以看到由于错误的理解, 分治导致出现 2^1000 - 2 个实例
还有一点注意的是: 默认 pool 的大小是 核心-1, 并且是并行的1
直接爆炸 💥
某一刻的 profile
jprofile active code: https://zhile.io/2022/02/22/jprofiler-license.html
解决方法:
不要用 forkJoinPool 来解决非分治问题2
https://www.bilibili.com/video/BV1fr42157T1/
今天看到处理器调度, 想到和这个关联关系. 可能需要从 CPU L1 cache 这个角度来思考, 为什么有的时候并发和并行并不会带来好的结果