CompletableFuture
Java 8 がJava メモリ モデルとどのように相互作用するかを理解しようとしています。プログラマーの正気のために、理想的には次のことが当てはまるように思えます。
完了に依存するステージが実行されるCompletableFuture
前に発生するスレッド内のアクション完了を登録するスレッド内のアクションは、完了依存ステージが実行される前に発生する依存ステージを作成します
java.util.concurrent のドキュメントには、次のようなメモがあります。
への送信前のスレッド内のアクションは、その実行が開始される前に発生
Runnable
します。に提出されたについても同様です。Executor
Callable
ExecutorService
これは、future を完了するスレッドが完了依存ステージを実行するか、Executor
. 一方、CompletableFuture のドキュメントを読んだ後、私はそれについてよくわかりません:
非非同期メソッドの依存完了のために提供されるアクションは、現在の を完了するスレッド
CompletableFuture
、または完了メソッドの他の呼び出し元によって実行される場合があります。
それは私の質問に私をもたらします:
- 上記の 2 つの仮定上の特性は正しいですか?
- で作業するときのメモリ可視性の保証の有無について、特定のドキュメントはどこかにあり
CompletableFuture
ますか?
補遺:
具体的な例として、次のコードを検討してください。
List<String> list1 = new ArrayList<>();
list1.add("foo");
CompletableFuture<List<String>> future =
CompletableFuture.supplyAsync(() -> {
List<String> list2 = new ArrayList<>();
list2.addAll(list1);
return list2;
});
"foo"
への追加list1
がラムダ関数に表示されることが保証されていますか? list1
への追加list2
が の依存ステージに表示されることが保証されていfuture
ますか?