CompletableFuture<Integer> fastRequest = CompletableFuture.supplyAsync(
() -> {
if (new Random().nextBoolean()) {
return 42;
} else {
return 1;
}
});
CompletableFuture<Integer> slowRequest =
CompletableFuture.supplyAsync(
() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
return 41;
});
return fastRequest.thenCompose(
fastResult -> {
if (fastResult == 42) {
return CompletableFuture.completedFuture(42);
} else {
// this is a data race, right?
return slowRequest.thenApply(slowResult -> slowResult + fastResult);
}
});
}
есть ли тут гонка по данным?
в смысле fastResult - это же просто данные, а мы их в thenApply прихаем, который потенциально вообще на другом threadPool исполняется
Я бы такой код спокойно написал бы, мне кажется там всё ок, но я и JLS не читал 🙂
Обсуждают сегодня