세션 자체는 스레드로부터 안전합니다. 그렇다고해서 어떤 종류의 동기화도없이 사용하면 올바른 동작으로 이어지지는 않습니다. 다중 스레드가 액세스 할 경우 세션이 올바르게 작동한다는 것을 의미합니다.
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를 권장합니다..
동기화 된 블록은 코드 블록에 대한 액세스를 여러 스레드에서 직렬화하기위한 것입니다. – Vikdor
여기 McDowell의 답변보기 http://stackoverflow.com/questions/616601/is-httpsession-thread-safe-are-set-get-attribute-thread-safe-operations –