2012-05-03 4 views
0

저는 서버 측 코딩과 JSP/서블릿에 익숙하지 않습니다. 나는 3 개의 클래스를 가진 코드를 가지고있다. 1st는 java httpservlet에서 상속 된 Serv 클래스입니다. 이 doPost() 메서드를 구현했습니다. doPost()에서 두 번째 클래스 인 ResourceClass의 객체를 사용합니다. ResourceClass는 싱글 톤 클래스입니다. 따라서 기본적으로 어떤 메소드를 사용하는 것은 ResourceClass.getInstance()와 같은 일을합니다. readResource(); 이제 readResource furthur는 Java 네이티브 액세스 라이브러리를 사용하여 디스크에서 리소스를 읽습니다. 이제 내 질문은 1000 클라이언트가 각 새 요청에 대한 내 서버 (Apache Tomcat)에 연결하는 경우 요청을 제공하는 새 서블릿이 있기 때문에 이해합니다. 그러나이 모든 서블릿은 본질적으로 동일한 싱글 톤 객체를 사용할 것입니다. 따라서이 판독 값은 스레드로부터 안전합니다.서버 측 코드의 스레드 안전성

본인은 내부 상태를 변경하지 않습니다. 그래서 나는 그것이 내 출력에 영향을 미치지 않을 것이라고 생각합니다. 따라서 모든 것들은 멱등수입니다. 하지만 이러한 모든 요청이 대기열에 올려 져 있기 때문에 싱글 톤 클래스 객체가 병목 현상을 일으킬 수 있습니다. 또는 각 서블릿에는 자체 사본이 있습니다.

또한 리소스 상태를 변경하면 스레드 안전성을 유지합니다.

답변

0

우선, 각 요청에 대해 새 서블릿을 만들지 않을 것입니다. 동일한 서블릿 인스턴스가 모든 요청을 동시에 처리하는 데 사용됩니다. 서블릿은 또한 싱글 톤입니다. 웹 컨테이너는 하나의 인스턴스 만 인스턴스화합니다.

ResourceClass 싱글 톤에 대한 요청이 대기열에 있다고 말합니다. 이 방법을 synchronized으로 표시하거나 다른 잠금 메커니즘을 사용하지 않는 한 그렇지 않습니다. 그렇게하지 않으면 쓰레드가 싱글 톤 메소드를 동시에 호출합니다.

싱글 톤의 코드와 JNI 라이브러리의 코드를 보지 않고는 스레드로부터 안전한지 여부를 말할 수 없습니다. 읽기 전용이라는 사실은 이 스레드로부터 안전 할 수 있다는 신호이지만 보장 할 수는 없습니다.

+0

감사합니다. JB. 서블릿 컨테이너에 대한 좋은 지침서를 읽어야한다고 생각합니다. 귀하의 대답은 매우 유익합니다. – user1294764

0

Java EE 서버의 각 서블릿 인스턴스는 1 개입니다. 한편, 각 http 요청은 자체 스레드에서 서버에 의해 처리됩니다.

ResourceClass의 인스턴스가 하나 있기 때문에이 인스턴스가 단일성이므로 readResource() 메서드가 동기화되면 병목 현상이 발생합니다.