2012-03-12 2 views
4

서블릿에 대한 각 요청에 대해 doPost() 또는 doGet() 메소드가 실행되고 init() 메소드 내에있는 코드가 한 번만 초기화된다는 것을 알고 있습니다. 그러나이 모든 방법 밖에 작성된 코드는 어떻게됩니까?
해당 코드도 스레드입니까? 그 부분에서 선언 된 varibles는 doPost()에서 수정 된 경우 해당 변경 사항이 서블릿의 다른 requsts에 반영 될 것입니까?서블릿에서 init() 메소드 외부에서 선언 된 변수

답변

5

정상적인 서블릿 컨테이너에서 서블릿 개체의 인스턴스는 하나뿐입니다. 이 객체는 임의의 수의 스레드 (요청 당 하나의 스레드)에서 사용될 수 있습니다. 서블릿 인스턴스의 수명 관리는 서블릿 컨테이너에 달려 있습니다.

따라서 모든 메소드 (init() 포함)에서 클래스 변수의 값을 변경하면 모든 후속 요청에 영향을줍니다. 메서드 내에서 로컬 변수를 변경하거나 선언해도 다음에 메서드를 호출 할 때 로컬 변수가 다시 만들어지고 메서드가 완료되면 가비지 수집기에서 소멸되므로 아무 것도 영향을주지 않습니다.

1

서블릿 인스턴스가 컨테이너에 의해 풀링된다. 따라서 실제 시나리오에서는 원하는 수의 서블릿 객체를 여러 스레드에서 공유 할 수 있습니다. 모든 doXXX() 메소드와 그것으로부터 호출 된 다른 메소드는 Threads에 의해 공유 될 것이다.

따라서 서블릿에서 클래스 수준 변수 (상태를 유지하기 위해)를 사용하는 것은 매우 바람직하지 않습니다. Constants, Static helper 메쏘드와 인스턴스에 의해 공유되고 Servlet을 사용하는 클라이언트에 의해 끊임없이 수정되지 않는 정적 변수를 가질 수 있습니다.

사안은 권장되지만 변수/메소드를 동기화하지 못하게하는 것은 아닙니다. 이렇게하면 한 번에 하나의 스레드 만 리소스에 액세스 할 수 있지만 스레드가 잠금을 점유하기 전에 먼저 다른 스레드가 리소스를 해제 할 때까지 기다려야하므로 성능이 저하 될 수 있습니다.

더 좋은 방법이 있습니다. 서블릿으로 상태를 유지하고 클라이언트 당 변수를 저장하려면 서블릿에 javax.servlet.SingleThreadModel을 구현해야합니다. 서블릿이이 마커 인터페이스를 구현하면 컨테이너는 상태를 유지한다는 것을 알 수 있으므로 인스턴스 당 하나의 스레드 만 제공됩니다.

+0

javax.servlet.SingleThreadModel은 더 이상 사용되지 않습니다. –

관련 문제