Программисты JAVA общаются здесь
-
Anonymous
ForkJoinPool и RecursiveTask приводят к взаимоблокировке, когда соединение вызывается в другом потоке, чем разветвление.
Сообщение
Anonymous »
Программа ниже никогда не заканчивается:
Код: Выделить всё
void main() {
try (Fibonacci fibonacci = new Fibonacci()) {
IO.println(fibonacci.calculate(9));
}
}
public static class Fibonacci implements AutoCloseable {
private final ConcurrentHashMap cache;
private final ForkJoinPool pool;
public Fibonacci() {
cache = new ConcurrentHashMap();
pool = new ForkJoinPool(2);
}
public long calculate(int n) {
return pool.invoke(new FibonacciTask(n));
}
private class FibonacciTask extends RecursiveTask {
private final int n;
private FibonacciTask(int n) {
this.n = n;
}
@Override
protected Long compute() {
IO.println("[%d] Start".formatted(n));
if (n < 3) {
IO.println("[%d] End".formatted(n));
return 1L;
}
FibonacciTask previousValue = cache.putIfAbsent(n, this);
if (previousValue != null) {
IO.println("[%d] Wait".formatted(n));
long cachedValue = previousValue.join(); //
Подробнее здесь: [url]https://stackoverflow.com/questions/79833584/forkjoinpool-and-recursivetask-lead-to-deadlock-when-join-is-called-in-a-differe[/url]
1764456544
Anonymous
Программа ниже никогда не заканчивается:
[code]void main() {
try (Fibonacci fibonacci = new Fibonacci()) {
IO.println(fibonacci.calculate(9));
}
}
public static class Fibonacci implements AutoCloseable {
private final ConcurrentHashMap cache;
private final ForkJoinPool pool;
public Fibonacci() {
cache = new ConcurrentHashMap();
pool = new ForkJoinPool(2);
}
public long calculate(int n) {
return pool.invoke(new FibonacciTask(n));
}
private class FibonacciTask extends RecursiveTask {
private final int n;
private FibonacciTask(int n) {
this.n = n;
}
@Override
protected Long compute() {
IO.println("[%d] Start".formatted(n));
if (n < 3) {
IO.println("[%d] End".formatted(n));
return 1L;
}
FibonacciTask previousValue = cache.putIfAbsent(n, this);
if (previousValue != null) {
IO.println("[%d] Wait".formatted(n));
long cachedValue = previousValue.join(); //
Подробнее здесь: [url]https://stackoverflow.com/questions/79833584/forkjoinpool-and-recursivetask-lead-to-deadlock-when-join-is-called-in-a-differe[/url]