我有一个线程,它调用两个不同的线程。它将同一个CompletableFuture
传递给这两个子线程。如果在这两个线程中同时调用了.get()
方法,是否会出现任何并发问题?
- 可能会破坏
CompletableFuture
吗? - 是否有可能看不到由
.get()
返回的对象上做出的最后更改? - 如果之后修改该对象会怎样?
作为具体示例,在下面的代码中,假设在cfInput
完成后没有更改cfInput.get()
返回的对象,那么这两个线程是否可能打印不同的值?
public void mainClass(CompletableFuture<ObjA> cfInput){
class1.doAsync1(cfInput);
class2.doAsync2(cfInput);
}
@Async
public void doAsync1(CompletableFuture<ObjA> cfInput){
//logic
System.out.println(cfInput.get().getObjB().getBlah());
//logic
}
@Async
public void doAsync2(CompletableFuture<ObjA> cfInput){
//logic
System.out.println(cfInput.get().getObjB().getBlah());
//logic
}
public class ObjA{
private ObjB objB;
public ObjB getObjB();
public void setObjB();
}
public class ObjB{
private String blah;
public String getBlah();
public void setBlah();
}
get()
无法从多个线程中安全调用,对我来说似乎非常奇怪。 完全有理由认为,在某些多线程程序中,可能需要多个线程等待计算或查询的结果,如果您使用的是CompletableFuture
,那么根据定义,您正在进行多线程编程。 - Solomon Slowget()
返回的对象吗?但那是_你的_对象,对吧?我的意思是,它是你的代码提供来完成future的任何对象。你的代码示例没有显示该对象来自哪里,甚至没有显示该对象的类型。因此,除非你展示更多的代码,否则只有你能说它是否线程安全。 - Solomon SlowCompletableFuture
。你正在询问由get
返回的对象,它是一个自定义对象,并将遵循您选择在其中实现的任何线程安全规则。一旦get
返回,您就不再处于CompletableFuture
领域了。 - Sotirios Delimanolis