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 не читал 🙂
Обсуждают сегодня