可兼容未来、可变对象和内存可见性
2022-09-01 21:26:15
我试图理解Java 8中如何与Java内存模型交互。在我看来,对于程序员的理智,以下情况在理想情况下应该成立:CompletableFuture
- 线程中完成发生的操作 - 在执行任何
完成相关阶段之前CompletableFuture
注册完成的线程中的操作会创建一个依赖阶段 - 在执行从完成相关阶段之前
java.util.concurrent 文档中有一条注释说:
线程中的操作在提交到 happen 之前 (在其执行开始之前)。同样,对于 提交给 .
Runnable
Executor
Callable
ExecutorService
这表明第一个属性为真,只要完成将来的线程执行与完成相关的阶段或将其提交给 .另一方面,在阅读了CompletableFuture文档之后,我不太确定这一点:Executor
为非异步方法的依赖完成提供的操作可以由完成当前方法的线程执行,也可以由完成方法的任何其他调用方执行。
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;
});
是否保证添加到对 lambda 函数可见?是否可以保证 添加到 对 的依赖阶段可见?"foo"
list1
list1
list2
future