在成功调用Future<?>
之后,检查在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;
}
}
答案 0 :(得分:0)
Future#get()
的文档中说:
在必要时等待计算完成,然后检索其结果。
因此,一旦调用Future.get()
方法,就可以完全断言,因为这些值将在那时解析。
答案 1 :(得分:0)