Java 동시성 : WebService Access ThreadSafe를 만듭니다
-
10-07-2019 - |
문제
Axis2 웹 서비스로 동시성을 처리하는 올바른 / 가장 좋은 방법을 알고 싶습니다.
예를 들어,이 코드가 주어지면 :
public class MyServiceDelegate
{
@Resource
UserWebService service; // Injected by spring
public CustomerDTO getCustomer()
{
String sessionString = getSessionStringFromCookies();
service.setJSESSIONID(sessionString);
CustomerDTO customer = service.getCustomerFromSessionID();
}
}
위의 userwebservice는 제 3 자 API입니다. 서비스는 전화를 걸 때 쿠키를 JSESSIONID
인증 된 세션의.
이 진술이 threadSafe가 아니라고 가정 할 때 맞습니까? 즉, 두 개의 스레드가 주어지면 다음이 발생할 수 있습니까?
- Threada :
service.setJSESSIONID("threadA")
- 스레드 B :
service.setJSESSIONID("threadB")
- Threada :
service.getCustomerFromSessionID // service.sesionID == "threadB"
그렇다면이 상황을 처리하는 가장 적절한 방법은 무엇입니까? 서비스에 리소스 풀을 사용해야합니까? 아니면 서비스를 동기화로 선언해야합니까?
public CustomerDTO getCustomer()
{
synchronized( service ) {
service.setJSESSIONID(sessionString);
CustomerDTO customer = service.getCustomerFromSessionID();
}
}
아니면이 문제를 처리하는 또 다른 적절한 방법이 있습니까?
해결책
각 스레드에는 고유 한 대의원 객체가 있으므로 자체 userwebservice 서비스가 있습니까?
간단한 경우, 대의원이 스택에 생성되면 스레드는 독립적입니다.
창조 비용이 높으면 대표 물체의 풀을 가지고 있습니다. 수영장에서 하나를 가져가는 것은 비교할 수 있습니다. 하우스 키핑에 매우주의를 기울여야하지만 효과적으로 데이터베이스 연결로 수행됩니다. 일부 환경에는 그러한 풀링을 관리하기위한 유틸리티 클래스가 있습니다. 자신의 롤링보다 바람직한 경향이 있습니다.
다른 팁
userwebservice가 수업 중 하나입니까? 그렇다면 메소드 서명을 다음으로 변경했다고 생각합니다.
public CustomerDTO getCustomer()
{
CustomerDTO customer = service.getCustomerFromSessionID(sessionString);
}
그리고 userwebservice가 상태를 유지하지 못하면 본질적으로 스레드-안전합니다.
당신이 말했듯이, 함수는 스레드 안전하지 않습니다. Java는 모니터를 만드는 간단한 방법을 가지고 있으며, 이는 한 번의 스레드 만 한 번에 함수에 액세스 할 수있는 객체입니다. 더 많은 정보 모니터
스레드를 안전하게 만들려면, 표현식 주위 또는 기능 이름 앞에 동기화 할 수 있습니다.
public synchronized CustomerDTO getCustomer(){
service.setJSESSIONID(sessionString);
CustomerDTO customer = service.getCustomerFromSessionID();
}
둘의 차이점은 모니터로 바꾸는 객체입니다.