我试图了解CompletableFuture
Java 8 中如何与Java 内存模型交互。在我看来,对于程序员的理智来说,理想情况下,以下内容应该是正确的:
- 线程中完成
CompletableFuture
发生之前的操作,任何与完成相关的阶段都被执行 - 线程中
注册完成的动作会在完成依赖阶段执行之前创建一个依赖阶段
java.util.concurrent 文档中有一条注释说:
线程中的操作在提交
Runnable
到Executor
发生之前执行之前。同样对于Callable
s 提交到一个ExecutorService
.
这表明第一个属性为真,只要完成未来的线程执行完成依赖阶段或将其提交给Executor
. 另一方面,在阅读CompletableFuture 文档后,我不太确定:
为非异步方法的依赖完成提供的操作可以由完成当前的线程执行,也可以由
CompletableFuture
完成方法的任何其他调用者执行。
这让我想到了我的问题:
- 上面的两个假设属性是真的还是假的?
- 是否有任何特定文档说明在使用 时是否存在内存可见性保证
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
lambda 函数可见?是否保证添加list1
到list2
的依赖阶段是可见的future
?