내 자바 서블릿 웹 응용 프로그램이 스레드로부터 안전한지 어떻게 확인합니까? 세션 변수, 클래스의 정적 변수 또는 스레드 안전 문제가 될 수있는 다른 것에 관해서는 무엇을해야합니까?Java에서 웹 응용 프로그램이 스레드로부터 안전한지 어떻게 확인합니까?
답변
사실 생각 정적 변수를 사용하지 않는 경우 서블릿의 변수와 필터를 사용하지 않는 : 서블릿의 한 인스턴스가 웹 애플리케이션의에있다 일생. 그것은 webapp의 시작시 생성되고 webapp의 종료시 파괴됩니다. 대략적인 해석은 this answer을 참조하십시오.
따라서 모든 요청 (스레드)간에 공유되었습니다. 요청 또는 세션 범위 데이터를 인스턴스 (또는 더 나쁜 경우, static
) 변수로 할당하면 응용 프로그램 전체의 모든 사용자 (세션)의 모든 요청 (스레드)간에 공유되므로 스레드 안전성이 보장되지 않습니다. 스레드를 안전하게 유지하려면 메서드 로컬 변수로 할당하면됩니다. 그래서 :
public class MyServlet extends HttpServlet {
private Object thisIsNOTThreadSafe;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Object thisIsThreadSafe;
thisIsNOTThreadSafe = request.getParameter("foo"); // BAD!! Shared among all requests!
thisIsThreadSafe = request.getParameter("foo"); // OK, this is thread safe.
}
}
마음에 threadsafety와 서블릿을 개발할 때 고려해야 할 모든.
그런 다음 동일한 사용자의 여러 요청간에 공유 할 수있는 세션 (HttpSession
) 속성이 있지만 실제로는 세션 액세스 동기화에 대해 걱정할 필요가 없습니다. 일반적으로 로그인 한 사용자, 사용자 별 기본 설정, 장바구니 등 사용자 고유의 데이터 만 저장합니다. 순수한 요청 범위 데이터를 세션 범위에 두지 않아도됩니다. 동일한 세션 내에서 여러 브라우저 창/탭에 반영됩니다.
그런 다음 응용 프로그램 전체에서 공유되는 응용 프로그램 (ServletContext
) 특성이 있지만 일반적으로 웹 응용 프로그램 구성, DAO 팩터 리, 드롭 다운 목록 내용 등의 상수 및 기타 정적 데이터 만 넣습니다.이 모든 작업은 ServletContextListener
으로 수행 할 수 있으며 기본 예제는 this answer입니다. 순수한 요청 범위 또는 세션 범위 데이터를 응용 프로그램 범위에 넣지 않아도됩니다.
다른 Java 응용 프로그램과 달리 컨텍스트에서 의미합니까? 실제로 많은 차이가 없습니다. 서블릿에 대한 각 요청은 컨테이너가 처리하도록 새 스레드를 발행하게하므로 서블릿 내의 인스턴스 변수는 스레드로부터 안전해야합니다. doGet/doPost() 메소드에서 로컬 변수를 사용하여 모든 비즈니스를 처리하는 것이 좋습니다. 내가 생각할 수있는 하나의 잡종이있다. 세션 변수를 사용하면 사용자가 응용 프로그램을 가리키는 두 개의 브라우저 창이 열려있을 수 있습니다. 이 경우 세션 범위와 함께 스레드 안전을주의해야합니다.
와우,로드 된 질문입니다.
간단히 말하면 공유 데이터에 대한 액세스가 신중하게 동기화되어야합니다. 예를 들어 정적 변수에 대한 액세스를 뮤텍스 또는 동기화 된 기능과 동기화하려고 할 수 있습니다.
여러 공유 리소스를 동시에 수정하는 원 자성 트랜잭션이 필요한 경우 상위 수준에서 동기화해야 할 수도 있습니다.
동시 응용 프로그램을 설계하는 것은 간단하지 않으며 마술 총알도 없습니다 (불행히도). 안전 동시 코드 작성에 대한 자세한 내용은 책 "Java Concurrency in Practice"을 사용하는 것이 좋습니다.
- 1. 파이썬 모듈을 평가하는 방법은 스레드로부터 안전한지 여부입니다.
- 2. 내 방법이 스레드로부터 안전한지 여부는 언제 물어야합니까?
- 3. 응용 프로그램의 구성을 어떻게 확인합니까?
- 4. Windows (구체적으로 Vista)에서 내 응용 프로그램이 멈추었는지 어떻게 확인합니까?
- 5. 클래스가 스레드로부터 안전한지 여부를 태그하는 방법은 무엇입니까? MSDN 문서에서
- 6. 현재 로그인 세션 중에 이미 프로그램이 실행되었는지 어떻게 확인합니까? (Windows)
- 7. 응용 프로그램이 웹 응용 프로그램인지 확인하는 방법
- 8. HtmlCleaner 스레드로부터 안전한가요?
- 9. 응용 프로그램의 .NET 버전은 어떻게 확인합니까?
- 10. libSoX는 스레드로부터 안전한가요?
- 11. 추적 웹 응용 프로그램이 있습니까?
- 12. C++을 사용하여 Windows에서 프로그램이 실행되는 시점을 어떻게 확인합니까?
- 13. 폼 팩터 계산시 내 프로그램이 올바른지 어떻게 확인합니까?
- 14. 나에게 주어진 객체가 Java에서 int []인지 어떻게 확인합니까?
- 15. Perl의 inet_aton은 스레드로부터 안전합니까?
- 16. 이 메서드는 스레드로부터 안전합니까?
- 17. 아래의 흐름이 스레드 안전한지 당신이 제안 시겠어요 웹 어플리케이션의 mutithreaded 환경
- 18. 행을 삭제해도 안전한지 확인하십시오.
- 19. tomcat 웹 응용 프로그램이 언제 중단되었는지 어떻게 알 수 있습니까?
- 20. OAuth 요청을 어떻게 확인합니까?
- 21. PHP에서 호스트를 어떻게 확인합니까?
- 22. SQLite3 구문을 어떻게 확인합니까?
- 23. 네트워크 연결을 어떻게 확인합니까?
- 24. 파일 형식을 어떻게 확인합니까?
- 25. 는 어떻게 확인합니까 1
- 26. 병합이 필요한지 어떻게 확인합니까?
- 27. IsolatedStorageFile이 있는지 어떻게 확인합니까?
- 28. PrintDialog.AllowCurrentPage의 값을 어떻게 확인합니까?
- 29. 302 응답을 어떻게 확인합니까?
- 30. AJAX는 어떻게 사용자를 확인합니까?
"웹 앱의 일생에서 한 서블릿"에 관한 한 가지 질문 - 풀링 된 객체라고 생각했습니다. 로드에 따라 서블릿 엔진의 재량에 따라 둘 이상일 수 있습니다. 그건 사실이 아닌가? – duffymo
(서블릿 2.4에서는 더 이상 사용되지 않음) 'SingleThreadModel'만 구현합니다. – BalusC
@BalusC : 대단히 감사합니다.이 답변은 나를 도왔습니다. 내 질문을 삭제하고 대답을 upvoted. Java에는 당신 같은 사람이 없습니다. 다시 한번 감사드립니다. –