2010-02-10 3 views

답변

21

사실 생각 정적 변수를 사용하지 않는 경우 서블릿의 변수와 필터를 사용하지 않는 : 서블릿의 한 인스턴스가 웹 애플리케이션의에있다 일생. 그것은 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입니다. 순수한 요청 범위 또는 세션 범위 데이터를 응용 프로그램 범위에 넣지 않아도됩니다.

+0

"웹 앱의 일생에서 한 서블릿"에 관한 한 가지 질문 - 풀링 된 객체라고 생각했습니다. 로드에 따라 서블릿 엔진의 재량에 따라 둘 이상일 수 있습니다. 그건 사실이 아닌가? – duffymo

+0

(서블릿 2.4에서는 더 이상 사용되지 않음) 'SingleThreadModel'만 구현합니다. – BalusC

+0

@BalusC : 대단히 감사합니다.이 답변은 나를 도왔습니다. 내 질문을 삭제하고 대답을 upvoted. Java에는 당신 같은 사람이 없습니다. 다시 한번 감사드립니다. –

0

다른 Java 응용 프로그램과 달리 컨텍스트에서 의미합니까? 실제로 많은 차이가 없습니다. 서블릿에 대한 각 요청은 컨테이너가 처리하도록 새 스레드를 발행하게하므로 서블릿 내의 인스턴스 변수는 스레드로부터 안전해야합니다. doGet/doPost() 메소드에서 로컬 변수를 사용하여 모든 비즈니스를 처리하는 것이 좋습니다. 내가 생각할 수있는 하나의 잡종이있다. 세션 변수를 사용하면 사용자가 응용 프로그램을 가리키는 두 개의 브라우저 창이 열려있을 수 있습니다. 이 경우 세션 범위와 함께 스레드 안전을주의해야합니다.

1

와우,로드 된 질문입니다.

간단히 말하면 공유 데이터에 대한 액세스가 신중하게 동기화되어야합니다. 예를 들어 정적 변수에 대한 액세스를 뮤텍스 또는 동기화 된 기능과 동기화하려고 할 수 있습니다.

여러 공유 리소스를 동시에 수정하는 원 자성 트랜잭션이 필요한 경우 상위 수준에서 동기화해야 할 수도 있습니다.

동시 응용 프로그램을 설계하는 것은 간단하지 않으며 마술 총알도 없습니다 (불행히도). 안전 동시 코드 작성에 대한 자세한 내용은 책 "Java Concurrency in Practice"을 사용하는 것이 좋습니다.

관련 문제