아래는 테스트 한 클래스의 수정 된 예제 클래스입니다.이 클래스가 스레드 안전 클래스인지 여부를 알고 싶습니다.Java에서 인스턴스 변수 및 스레드 안전
다른 게시물과 블로그에서 인스턴스 변수가 반드시 스레드로부터 안전하다고 대답 한 곳을 볼 수 있습니다. (대부분의 프리미티브 유형으로 표시되는 예제)
메서드 외부에서 OutputResponse 객체를 만들고 soapui에서로드 테스트를 수행하면 실패했지만 메서드 내에서 객체를 만들 때 항상로드 테스트가 성공했습니다.
@Service
public class ExampleProvider {
private OutputResponse outputResponse;
@Post
@Path("/test")
@Consumes("application/json")
@Produces("application/json")
public OutputResponseEntity execute (InputRequest inputRequest) {
outputResponse = new OutputResponse();
outputResponse.setSomeValue("this is test");
populateOutputResponse();
}
private OutoutResponseEntity<OutputResponse> populateOutputResponse() {
if(null != inputRequest) {
outputResponse.setSomeOtherValue(inputRequest.getName());
}
return new OutputResponseEntity(outputResponse,httpstatus.OK);
}
}
'@ Service'와 나머지 주석에 어떤 프레임 워크를 사용하고 있습니까? – markspace
아니요, 스레드로부터 안전하지 않습니다. 변경할 수있는 개인 공유 데이터가 있습니다. 그것이 "안전하지 않다"는 정의입니다. 개인 데이터 멤버를 제거하고 메서드에 로컬 인 OutputResponse를 만듭니다. 스레드로부터 안전합니다. – duffymo
@duffymo 메소드 내에서 로컬로 OutputResponse 변수를 작성하는 것은 스레드 안전하고 인스턴스 변수 "스레드 안전하지 않음"으로 유지하는 것을 기대했지만로드 테스트는 항상 두 경우 모두 성공합니다. 두 스레드, 초기 스레드 수는 20으로 시도했습니다. soapui에서 2로 종료 스레드 카운트 .. – jagan