2012-06-10 4 views
1

현재 웹 서버로 Apache Tomcat이 설치된 Java EE에서 새로운 웹 응용 프로그램을 작성하고 있습니다. jsp와 서블릿을 사용하고 있습니다.웹 응용 프로그램, JSP 및 멀티 스레드

제 질문은 :

저는 아주 표준적인 비즈니스 로직을 가지고 있습니다. 그것들 중 어느 것도 동기화되지 않습니다. 웹 응용 프로그램 로직의 단일 스레드 만 주어진 시간에 실행됩니까?

"동기화 된"모든 기능을 사용하면 엄청난 오버 헤드가 발생할 수 있으므로 이에 대한 대안이 있습니까?

내 프로젝트에 정적 메서드가있는 경우.

 for (int i=0;i<10000;i++) { 
      counter++; 
     } 

방법은 스레드로부터 안전하지 않은 경우, 다중 사용자 응용 프로그램에서와 같은 방법의 동작 무엇인가 : 그 같은 매우 간단한 일이 무엇입니까? 그것은 예상치 못한 행동입니까?! 난 다중 사용자 웹 응용 프로그램을 구축하는 것을 의미하는 경우

, 난 내 프로젝트에서 모든 것을 "동기화"해야합니다

다시 간단한 방법으로

? 모두가 아니라면 무엇을 동기화해야합니까?

답변

2

내 웹 응용 프로그램 논리의 단일 스레드 만 주어진 시간에 실행됩니까?

아니, 서블릿 컨테이너는 각 서블릿의 하나의 인스턴스를 생성하고 여러 스레드에서 해당 서블릿의 doService() 메소드를 호출합니다. 기본적으로 Tomcat에서는 서블릿을 동시에 호출하는 스레드를 최대 200 개까지 예상 할 수 있습니다.

서블릿이 단일 스레드 인 경우 응용 프로그램이 지옥처럼 느리게 동작합니다 (이유는 이유가 없으므로 SingleThreadModel 참조).

모든 기능을 "동기화"로 만드는 것은 엄청난 오버 헤드를 만듭니다. 어떤 대안이 있습니까?

코드가 스레드로부터 안전하거나 더 양호해야하며, 상태가 유지되어야합니다. 서블릿에 상태 (변경 가능한 필드 - 비정상)가없는 경우 여러 스레드가 안전하게 액세스 할 수 있습니다. 거의 모든 객체에 동일하게 적용됩니다.

for 루프가있는 샘플 코드에서 counter이 로컬 변수 인 경우이 코드는 스레드로부터 안전합니다. 필드라면 안전하지 않습니다. 각 스레드는 로컬 변수의 로컬 사본을 가지며 동일한 객체에 액세스하는 모든 스레드는 동일한 필드에 동시에 액세스합니다 (동기화가 필요함).

내가 동기화해야 할 항목은 무엇입니까?

가변적 인 전역 공유 상태. 예 : 샘플 코드에서 counter이 필드이고 여러 스레드에서 수정 된 경우이를 증가시켜야합니다 (AtomicInteger).

+0

와우, 훌륭한 답변 맨. 감사! – Urbanleg