Поточно-безопасно ли устанавливать значение для свойства класса в обратном вызове CompletableFuture? - PullRequest
0 голосов
/ 26 июня 2018

Я новичок в CompletableFuture в Java 8, и мне интересно, является ли следующий фрагмент кода поточно-ориентированным, когда я устанавливаю результат в свойствах членов класса в обратном вызове и пытаюсь прочитать их после вызова allOf().get(), а почему?

public void newInit() throws ExecutionException, InterruptedException {
    CompletableFuture cf1 = CompletableFuture.supplyAsync(() -> {
        return 1L;
    }).thenAccept(result -> {
        this.result1 = result;
    });
    CompletableFuture cf2 = CompletableFuture.supplyAsync(() -> {
        return 2L;
    }).thenAccept(result -> {
        this.result2 = result;
    });
    CompletableFuture.allOf(cf1, cf2).get();
}

1 Ответ

0 голосов
/ 28 июня 2018

Ваш вопрос покрывается Свойствами согласованности памяти , определенными для пакета java.util.concurrent:

Глава 17 Спецификации языка Java определяет отношение «происходит до» для операций с памятью, таких как чтение и запись общих переменных. Результаты записи одним потоком гарантированно будет видимым для чтения другим потоком, только если запись операция происходит до операции чтения. […]

Методы всех классов в java.util.concurrent и его подпакеты распространяют эти гарантии на синхронизацию более высокого уровня. В частности:

  • [...]
  • Действия, предпринятые асинхронными вычислениями, представленными действиями Future произойти до после получения результат через Future.get() в другой теме.
  • [...]

Итак, подведем итог, ваш get() вызов гарантирует, что ваши записи будут видны потоку после того, как он его выполнит.

...