에 대한 클래스의 새로운 인스턴스를 생성하는 것은 내 코드입니다 :방법 (CompletableFuture를 사용하여 만든) 각 asynchronus 호출 여기
class A{
@Autowired
B objB;
public method1(){
List<String> ids = new ArrayList<String>();
ids.add("1");
ids.add("2");
ids.add("3");
List<CompletableFuture<String>> listOfFuture ids.stream()
.map(id -> CompletableFuture.supplyAsync(() ->
objB.method2(id)).collect(toList());
}
}
class B{
@Inject
D objD;
@Inject
E objE
public String method2(String id){
String transformedId = objD.method3(id);
return objE.method4(transformedId);
}
}
클래스 B는 방법 2를 가지고하는 것은 스레드로부터 안전하지 않은 개체가 있습니다. method2를 실행하는 동안 각 스레드가 고유 한 객체를 갖도록 B의 새 인스턴스를 만들고 싶습니다. 나는 method2에 대한 스프링의 비동기 유틸리티를 사용할 수 있으며 클래스 A에서 CompletableFuture 대신 A에서 비동기 적으로이 메서드를 호출 할 수 있습니다. 그러면 method2 스레드를 안전하게 만들 수 있습니다. CompletableFuture를 사용하면 method2 스레드를 안전하게 만들 수 있습니까? 클래스 B는 스레드로부터 안전하지 않으므로 thread2를 호출하기 위해 스레드를 생성 할 때마다 클래스 B에 대해 다른 객체가 필요하다는 가정이 맞습니까? 여기
생성자 삽입을 사용하고 각 클래스 A 인스턴스에 B 클래스의 삽입 된 인스턴스가 있는지 확인합니다. 클래스 B의 인스턴스를 메서드에 전달하면 , 그것을 전달하는 객체와 마찬가지로 쓰레드 안전합니다. – duffymo
공유 할 수있는 변경 가능한 데이터가 문제입니다. 클래스 A의 모든 상태를 제거합니다. 클래스 B의 인스턴스를 매개 변수로 method()에 전달하면 스레드로부터 안전합니다. – duffymo
코드 샘플을 자세히 설명해 주시겠습니까? –