小编A.L*_*.L.的帖子

CompletableFuture,可变对象和内存可见性

我试图理解CompletableFutureJava 8 如何与Java内存模型交互.在我看来,对于程序员的理智,理想情况下应该成立:

  1. 完成任务的线程中的操作CompletableFuture - 在执行任何完成相关的阶段之前
  2. 在该线程操作注册完成创建依赖阶段发生,之前完成执行依赖阶段

java.util.concurrent文档中有一条说明:

在提交Runnable到执行之前的线程中的操作Executor - 在执行开始之前.同样的Callables提交给ExecutorService.

这表明第一个属性为true,只要完成未来的线程执行完成依赖阶段或将其提交给Executor.另一方面,在阅读CompletableFuture文档后,我不太确定:

为非异步方法的依赖完成提供的动作可以由完成当前的线程执行CompletableFuture,或者由完成方法的任何其他调用者执行.

这让我想到了我的问题:

  1. 这两个假设属性是否真实?
  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;
        });
Run Code Online (Sandbox Code Playgroud)

能够保证所有的加入"foo"list1是可见的lambda函数?是否保证添加 …

java java.util.concurrent java-memory-model java-8 completable-future

20
推荐指数
1
解决办法
884
查看次数