서블릿에 대한 각 요청에 대해 doPost() 또는 doGet() 메소드가 실행되고 init() 메소드 내에있는 코드가 한 번만 초기화된다는 것을 알고 있습니다. 그러나이 모든 방법 밖에 작성된 코드는 어떻게됩니까?
해당 코드도 스레드입니까? 그 부분에서 선언 된 varibles는 doPost()
에서 수정 된 경우 해당 변경 사항이 서블릿의 다른 requsts에 반영 될 것입니까?서블릿에서 init() 메소드 외부에서 선언 된 변수
답변
정상적인 서블릿 컨테이너에서 서블릿 개체의 인스턴스는 하나뿐입니다. 이 객체는 임의의 수의 스레드 (요청 당 하나의 스레드)에서 사용될 수 있습니다. 서블릿 인스턴스의 수명 관리는 서블릿 컨테이너에 달려 있습니다.
따라서 모든 메소드 (init() 포함)에서 클래스 변수의 값을 변경하면 모든 후속 요청에 영향을줍니다. 메서드 내에서 로컬 변수를 변경하거나 선언해도 다음에 메서드를 호출 할 때 로컬 변수가 다시 만들어지고 메서드가 완료되면 가비지 수집기에서 소멸되므로 아무 것도 영향을주지 않습니다.
defaut로 서블릿은 스레드 안전하지 않음. 하나의 서블릿 인스턴스가 많은 클라이언트에 대해 호출됩니다. 상태를 서블릿 내부에 인스턴스 변수로 저장하는 것은 절대적으로 잘못되었습니다.
참고 :
서블릿 인스턴스가 컨테이너에 의해 풀링된다. 따라서 실제 시나리오에서는 원하는 수의 서블릿 객체를 여러 스레드에서 공유 할 수 있습니다. 모든 doXXX() 메소드와 그것으로부터 호출 된 다른 메소드는 Threads에 의해 공유 될 것이다.
따라서 서블릿에서 클래스 수준 변수 (상태를 유지하기 위해)를 사용하는 것은 매우 바람직하지 않습니다. Constants, Static helper 메쏘드와 인스턴스에 의해 공유되고 Servlet을 사용하는 클라이언트에 의해 끊임없이 수정되지 않는 정적 변수를 가질 수 있습니다.
사안은 권장되지만 변수/메소드를 동기화하지 못하게하는 것은 아닙니다. 이렇게하면 한 번에 하나의 스레드 만 리소스에 액세스 할 수 있지만 스레드가 잠금을 점유하기 전에 먼저 다른 스레드가 리소스를 해제 할 때까지 기다려야하므로 성능이 저하 될 수 있습니다.
더 좋은 방법이 있습니다. 서블릿으로 상태를 유지하고 클라이언트 당 변수를 저장하려면 서블릿에 javax.servlet.SingleThreadModel
을 구현해야합니다. 서블릿이이 마커 인터페이스를 구현하면 컨테이너는 상태를 유지한다는 것을 알 수 있으므로 인스턴스 당 하나의 스레드 만 제공됩니다.
- 1. C++ 메소드 변수 선언
- 2. foreach 루프 외부에서 변수 선언
- 3. 전쟁 배포 init 메소드
- 4. 메소드 외부에서 선언 된 변수를 사용하는 방법은 무엇입니까?
- 5. 서블릿 생성자 및 init() 메소드
- 6. as3 GLOBAL 변수 선언 - TIMELINE/클래스 외부에서
- 7. 메소드 외부에서 사용할 인스턴스 변수 초기화
- 8. @implementation에 선언 된 변수
- 9. zf2 컨트롤러의 init 메소드
- 10. 서블릿의 init() 메소드
- 11. 클래스 범위 외부에서 선언 된 열거 형
- 12. cocos2d가있는 init 메소드 내부에서 EXC_BAD_ACCESS
- 13. 선언 된 변수 이름 찾기
- 14. 서블릿에서 글로벌 변수 동기화하기
- 15. objective-C의 커스텀 init 메소드
- 16. UIVIewController 사용자 정의 init 메소드
- 17. ServletContextListener v/s init() 메소드
- 18. 변수 선언
- 19. 함수 외부의 변수 선언
- 20. 형태의 CXF 메소드 선언
- 21. 자바 제네릭 메소드 선언
- 22. 비정상적인 "정적"메소드 선언
- 23. C++ 메소드 선언 질문
- 24. 변수 선언?
- 25. 전용 메소드 매개 변수
- 26. 구조체 플러그인, 등록시 init 메소드 호출하기
- 27. C++ 선언 된 클래스 외부에서 전역 적으로 선언 된 enum을 사용할 수없는 이유는 무엇입니까?
- 28. gdb가 가비지 출력을 일으키는 메소드 내부의 변수 선언
- 29. 자바 스크립트에서 보호 된 변수 선언
- 30. 선언 된 네임 스페이스 외부에서 클래스의 가시성을 제한하는 방법은 무엇입니까?
javax.servlet.SingleThreadModel은 더 이상 사용되지 않습니다. –