문제

또한, 설정중인 객체는 세션에 저장된 객체의 상태가 무엇인지 알기 위해 스레드 안전해야합니다.

또한 웹에서 일부는 다음을 사용하는 것을 읽고있었습니다.

synchronized(session) {
  session.setAttribute("abc", "abc");
}

이것이 유효한 제안입니까?

도움이 되었습니까?

해결책

아니요, IBM에 따르면 스레드 안전하지 않습니다. Java 이론 및 실습 : 모든 상태의 웹 애플리케이션이 깨 졌습니까?. 동기화해야합니다.

httpsession이 스레드 안전하지 않은 방법 Java Ranch에서도 도움이 될 수 있습니다.

다른 팁

서블릿 2.5 사양 :

요청 스레드를 실행하는 다중 서블릿은 동시에 동일한 세션 객체에 활성화 할 수 있습니다. 컨테이너는 세션 속성을 나타내는 내부 데이터 구조의 조작이 SuredSafe 방식으로 수행되도록해야합니다. 개발자는 속성 객체 자체에 대한 스레드 Safe 액세스에 대한 책임이 있습니다. 이렇게하면 HTTPSESSION 객체 내부의 속성 수집이 동시 액세스로부터 보호되어 응용 프로그램이 해당 컬렉션이 손상 될 수있는 기회가 제거됩니다.

안전합니다 :

// guaranteed by the spec to be safe
request.getSession().setAttribute("foo", 1);

이것은 ~ 아니다 안전한:

HttpSession session = request.getSession();
Integer n = (Integer) session.getAttribute("foo");
// not thread safe
// another thread might be have got stale value between get and set
session.setAttribute("foo", (n == null) ? 1 : n + 1);

이것은 ~ 아니다 안전한 보장 :

// no guarantee that same instance will be returned,
// nor that session will lock on "this"
HttpSession session = request.getSession();
synchronized (session) {
  Integer n = (Integer) session.getAttribute("foo");
  session.setAttribute("foo", (n == null) ? 1 : n + 1);
}

나는이 마지막 접근법이 (J2EE 책을 포함하여) 옹호하는 것을 보았지만 서블릿 사양에 의해 작동하는 것은 보장되지 않습니다. 당신은 할 수 있습니다 세션 ID를 사용하여 뮤텍스를 만듭니다, 그러나 더 나은 접근 방식이 있어야합니다.

아니요. 동일한 클라이언트 (세션 포함)가 동시 요청을 수행하는 것을 원하지 않으므로 다음과 같은 요청을 직렬화해야합니다. AbstractController 봄 MVC에서

어떤면에서 이것은 고객 설계에 따라 다릅니다.

웹 디자인에서 단일 클라이언트가 동일한 HTTP 세션을 사용하여 여러 개의 미결제 동시 요청을 가질 수있는 기회가 있습니까? 단일 HTTP 세션을 여러 소켓에 묶지 않으면하기가 어려워 보입니다. (AKA, AJAX)이 작업을 수행하지 못하면 서버가 관련된 한 주어진 클라이언트의 HTTP 액세스는 단일 스레드가됩니다. 즉, 단일 세션이 효과적으로 스레드 안전합니다.

세션 객체의 동기화는 웹 애플리케이션이 여러 번의 동시 요청을 가질 수 있도록 향후 변경 사항에 대해 응용 프로그램을 더 안전하게 만들어 지므로 나쁜 아이디어는 아닙니다. 최신 Java 구현에서 동기화에는 특히 동기화가 일반적으로 계약되지 않은 경우 이전에 관련된 비용이 크지 않습니다. 애플리케이션이 AJAX를 사용하는 경우 웹 서버에 대한 여러 기내 동시 요청이 예상되는 경우 동기화가 필수입니다.

그들은 그렇지 않지만 대부분의 시간에는 고객이 단일 스레드로 만 액세스 할 수 있습니다.

다른 클라이언트마다 다른 스레드가 있으며 각 스레드는 자체 세션을 갖습니다.

Eddie가 지적했듯이, 동일한 세션에 액세스하는 두 개의 스레드에 직면 할 수있는 한 상황은 두 개의 Ajax 호출이 동일한 세션 속성을 수정하려고 시도하는 것입니다. 그렇지 않으면 문제가 없습니다.

세션은 스레드 안전하지 않으며 세트 메소드가 스레드 안전을 보장하지 않습니다. 일반적으로 서블릿 컨테이너에서는 멀티 스레드 환경에 있어야하며 제공된 툴링이 안전하지 않다고 가정해야합니다.

이것은 또한 세션에 저장하는 객체에도 적용됩니다. 세션 자체는 저장된 객체를 조작하지는 않지만 다른 스레드에서 객체를 검색하고 조작하려고 시도 할 수 있습니다. 인종 조건이 가능한지 확인하기 위해 자신의 코드를 검사하는 것은 귀하에게 달려 있습니다.

게시 한 코드 예제는 유효하지만 문제는 예제의 제한된 범위를 넘어서 존재할 수 있습니다. 세션을 설정하는 동안 조건이 없음을 보장하지만 다른 스레드가 세트를 무시하는 것을 방해하는 것은 없습니다. 요청의 코드가 변경되지 않은 값에 따라 달라지면 여전히 문제가 발생할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top