2012-09-16 2 views
3

예를 들어, 사용자는 서블릿에 액세스 할 수 있으며 서블릿에는 세션과 관련된 일련의 작업이 있으며 시간이 걸릴 수 있습니다. 그 동안 사용자는 다른 창을 열고 세션에 관한 다른 서블릿을 방문합니다. 이 두 서블릿은 동일한 사용자가 방문하기 때문에 동일한 세션 변수를 사용합니다. 그래서 나는 거기에 싱크로나이즈 문제가 있다고 생각합니다.세션이 여러 서블릿간에 동기화 문제가 있습니까?

이러한 문제가있는 경우 문제를 해결할 수있을 정도로 sychronized 블록을 사용하고 있습니까? (나는 sychronized 블록이 같은 스레드에서만 사물을 처리 할 수 ​​있다고 생각한다.)

+2

동기화 된 블록은 코드 블록에 대한 액세스를 여러 스레드에서 직렬화하기위한 것입니다. – Vikdor

+0

여기 McDowell의 답변보기 http://stackoverflow.com/questions/616601/is-httpsession-thread-safe-are-set-get-attribute-thread-safe-operations –

답변

2

세션 자체는 스레드로부터 안전합니다. 그렇다고해서 어떤 종류의 동기화도없이 사용하면 올바른 동작으로 이어지지는 않습니다. 다중 스레드가 액세스 할 경우 세션이 올바르게 작동한다는 것을 의미합니다.

Integer visitCount = (Integer) session.getAttribute("visitCount"); 
visitCount = Integer.valueOf(visitCount.intValue() + 1); 
session.setAttribute("visitCount", visitCount); 

을 그리고 visitCount의 원래 값이 최종 결과는 2 (기대 값)이 될 수 0 가정, 또는 1이 될 수있다 : 예를 들어

, 당신은 다음과 같은 코드가 동시에 실행했다고 가정 실제로 두 스레드는 현재 값 conncurrently (0)을 읽은 다음 둘 모두를 1로 증가시키고 둘 다 세션에 저장합니다.

마찬가지로 세션에 스레드가 안전하지 않은 개체 (예 : HashMap)를 저장하고 두 스레드가이 HashMap을 동시에 사용하면 엉뚱한 동작이 나타날 수 있습니다.

모든 멀티 스레드 프로그램에서와 마찬가지로 필요한 경우 적절한 동기화 메커니즘을 사용해야하며 개체를 스레드로부터 안전하게 만들어야합니다. 그러나 이것은 전체 책의 주제입니다. 실제로는 Java Concurrency를 권장합니다..

관련 문제