Sto cercando di capire come CompletableFuture
in Java 8 interagisce con Java memory model. Mi sembra che per il programmatore di sanità mentale, il seguente dovrebbe idealmente tenere vero:CompletaFuturo, oggetti mutevoli e visibilità della memoria
- azioni nel thread che completa un
CompletableFuture
capitare-prima eventualicompletamentifasi dipendenti vengono eseguiti - azioni nel thread che
registra un completamentocrea una fase dipendente accade-prima viene eseguito il completamentofase dipendente
C'è una nota in java.util.concurrent documentation dicendo che:
azioni a un filo prima della presentazione di una
Runnable
ad unExecutor
accadere-prima dell'inizio sua esecuzione. Allo stesso modo perCallable
s inviato a unExecutorService
.
che suggerisce che la prima proprietà è vero, fino a quando il filo che completa il futuro esegue il completamento
fase dipendente o lo sottopone a un Executor
. D'altra parte, dopo aver letto CompletableFuture documentation io non sono così sicuro di questo:
azioni forniti per completamenti dipendenti di metodi non asincrone possono essere eseguite dal thread che completa l'attuale
CompletableFuture
, o da qualsiasi altra chiamante di un metodo di completamento.
che mi porta alle mie domande:
- sono le due proprietà sopra ipotetici vero o no?
- C'è qualche documentazione specifica ovunque sulla presenza o sulla mancanza di garanzie di visibilità della memoria quando si lavora con
CompletableFuture
?
Addendum:
Nel modo di un esempio concreto, si consideri questo codice:
List<String> list1 = new ArrayList<>();
list1.add("foo");
CompletableFuture<List<String>> future =
CompletableFuture.supplyAsync(() -> {
List<String> list2 = new ArrayList<>();
list2.addAll(list1);
return list2;
});
E 'garantito che l'aggiunta di "foo"
-list1
è visibile alla funzione lambda ? È garantito che l'aggiunta di list1
a list2
sia visibile alle fasi dipendenti di future
?
può chiarire cosa si intende per "filo che registra un completamento" – Misha
@Misha: OP significa ovviamente * * completamento azione o di una fase dipendenti. – Holger
@Holger se intende un'azione di completamento, quindi le due domande sono le stesse. È più plausibile che lui voglia dire stadio dipendente. – Misha