Future<?>成功调用后检查由 a 中执行的任务修改的字段是否安全future.get()?(是否保证完成设置值,并且我看到新值?)我会在调用future.get().或者我应该只使用返回值future.get()而不应该期望它像这样工作?例子:class MyData { private int a; public void setA(int a) { this.a = a; } public int getA() { return a; }}public class MainClass { public static void main(String[] args) { final Executor executor = Executors.newFixedThreadPool(15); final List<MyData> objects = Arrays.asList(new MyData(), new MyData() /* ... */); final Future<Void> future1 = CompletableFuture.supplyAsync(() -> { objects.get(0).setA(1); return null; }, executor); final Future<Void> future2 = CompletableFuture.supplyAsync(() -> { objects.get(1).setA(2); return null; }, executor); /* ... */ a.get(); b.get(); /* ... */ // Is it safe here to check the `a` field of the objects? assert objects.get(0).getA() == 1; assert objects.get(1).getA() == 2; }}
2 回答
拉莫斯之舞
TA贡献1820条经验 获得超10个赞
Future
状态的 javadoc
内存一致性影响:异步计算所采取的操作发生
Future.get()
在另一个线程中相应操作之后 。
由于get
仅在相应计算完成时返回(setA
调用 和),因此该计算通过调用 后与任何代码的发生之前return
关系可见。您对 的调用发生在 后,因此它将看到之前发生的的结果。get
getA
Future#get
setA
LEATH
TA贡献1936条经验 获得超6个赞
正如文档所说Future#get()
:
如有必要,等待计算完成,然后检索其结果。
因此,在调用该方法后进行断言是完全安全的,Future.get()
因为届时这些值将被解析。
添加回答
举报
0/150
提交
取消