我试图理解CompletableFuture
Java 8 如何与Java内存模型交互.在我看来,对于程序员的理智,理想情况下应该成立:
完成任务的线程中的操作CompletableFuture
- 在执行任何完成相关的阶段之前
在该线程操作注册完成创建依赖阶段发生,之前的完成执行依赖阶段
java.util.concurrent文档中有一条说明:
在提交
Runnable
到执行之前的线程中的操作Executor
- 在执行开始之前.同样的Callable
s提交给ExecutorService
.
这表明第一个属性为true,只要完成未来的线程执行完成依赖阶段或将其提交给Executor
.另一方面,在阅读CompletableFuture文档后,我不太确定:
为非异步方法的依赖完成提供的动作可以由完成当前的线程执行
CompletableFuture
,或者由完成方法的任何其他调用者执行.
这让我想到了我的问题:
这两个假设属性是否真实?
在使用时,是否有任何关于存在或缺乏内存可见性保证的特定文档CompletableFuture
?
附录:
在具体示例中,请考虑以下代码:
Listlist1 = new ArrayList<>(); list1.add("foo"); CompletableFuture > future = CompletableFuture.supplyAsync(() -> { List
list2 = new ArrayList<>(); list2.addAll(list1); return list2; });
能够保证所有的加入"foo"
到list1
是可见的lambda函数?是否保证添加list1
到list2
依赖阶段是可见的future
?