2010-03-30 6 views
1

(init() 메소드에서) 서블릿 초기화 중에 일부 매개 변수를 읽고 (getServletContext(). setAttribute()를 사용하여) 서블릿 컨텍스트 속성에 저장하려고합니다. 나중에 (getServletContext(). getAttribute()를 사용하여) 요청 처리 중에 이러한 매개 변수를 읽으 려합니다. 따라서 여러 스레드가 동시에이 작업을 수행 할 수 있습니다. 그런 시도가 안전한지 궁금한가요? getAttribute()에 대한 다중 스레드 호출이 서블릿 컨텍스트의 내부 상태를 망칠 수 없다는 것을 확신 할 수 있습니까?Tomcat ServletContext 구현의 getAttribute() 메소드가 동기화없이 호출 될 수 있습니까?

나는 초기화 외에도 setAttribute()를 호출하지 않을 것을 고려해야한다. 따라서 getAttribute()에 대한 호출 만 여러 스레드에서 수행됩니다. 그러나 내부 구현에 따라 위험 할 수도 있습니다. 그래서, Tomcat의 구현에 대한 정보는 높이 평가 될 것입니다.

답변

6

Tomcat에서 ServletContext의 주요 구현은 ApplicationContext 클래스입니다. 링크 된 리소스를 보면 속성이 java.util.concurrent.ConcurrentHashMap 인스턴스에 저장되어있는 것을 볼 수 있습니다. 따라서 ApplicationContext의 경우 적어도 getAttribute()setAttribute() 메서드는 스레드로부터 안전합니다.

관련 문제