Ich versuche zu verstehen, wie CompletableFuture
in Java 8 interagiert mit der Java memory model. Es scheint mir, dass für Programmierer Vernunft soll die folgenden idealerweise zutreffen:CompleableFuture, veränderbare Objekte und Speicher Sichtbarkeit
- Aktionen in dem Thread, ein
- Aktionen im Thread ausgeführt werden,
dass ein Beendigungsregisterschafft eine abhängige Stufe passieren-before dieBeendigungabhängige Stufe ausgeführt
CompletableFuture
geschehen zuvor all
Es gibt eine Notiz in java.util.concurrent documentation, dass zu sagen:
Aktionen in einem Thread vor der Vorlage eines
Runnable
zu einemExecutor
geschehen zuvor seine Ausführung beginnt. Ähnlich fürCallable
s an eineExecutorService
eingereicht.
, die darauf hindeuten würden, dass die erste Eigenschaft wahr, solange der Thread, der die Zukunft vervollständigt die
Abschluss
abhängig führt Bühne oder legt sie auf ein Executor
. Auf der anderen Seite, nach CompletableFuture documentation Lese bin ich nicht so sicher, dass:
Aktionen für abhängige Beendigungen von Nicht-Asynchron-Verfahren geliefert wird, können von dem Thread ausgeführt werden, der die aktuellen
CompletableFuture
, oder von einem anderen Anrufer abgeschlossen einer Abschlussmethode.
Was mich auf meine Fragen bringt:
- Sind die beiden hypothetischen Eigenschaften oben wahr ist oder nicht?
- Gibt es irgendeine spezifische Dokumentation über das Vorhandensein oder Fehlen von Speicher Sichtbarkeit garantiert, wenn Sie mit
CompletableFuture
arbeiten?
Nachtrag:
Auf dem Weg von einem konkreten Beispiel, betrachten Sie diesen Code:
List<String> list1 = new ArrayList<>();
list1.add("foo");
CompletableFuture<List<String>> future =
CompletableFuture.supplyAsync(() -> {
List<String> list2 = new ArrayList<>();
list2.addAll(list1);
return list2;
});
ist sichergestellt, dass "foo"
-list1
Zugabe zu der Lambda-Funktion sichtbar ist ? Ist gewährleistet, dass das Hinzufügen von list1
zu list2
für die abhängigen Stufen von future
sichtbar ist?
Können Sie erklären, was Sie mit „Thread, der einen Abschluss Register“ bedeuten – Misha
@Misha: die OP bedeutet natürlich eine * Abschluss Aktion * oder eine abhängige Stufe. – Holger
@Holger wenn er Abschluss Aktion bedeutet, dann sind die beiden Fragen gleich. Es ist plausibler, dass er abhängiges Stadium meint. – Misha