노출되는 이미지가 불편하시겠지만 양해를 구합니다. 노출, 클릭등에 관한 자료로 활용 중입니다.

thread-safe하도록 servlet작성하기


만약 자바로 웹 어플리케이션을 작성한다면, 서블릿이 가장 친숙한다. JSP로 작성하거나 일반 서블릿으로 작성하든 관계 없이, 서블릿이 제공하는 장점을 받게 된다.

thread-safe라는 것은? 여러 thread가 프로그램의 단일 instance을 실행하여, 메모리를 공유할때, 동일한 위치(영역, 값)를 읽고 쓰려고 시도 할 수 있습니다.


자바 프로그램과 마찬가지로 서블릿은 JVM내에서 실행되어야 하지만, 웹 어플리케이션의 경우 서블릿 컨테이너가 HTTP요청이 들어 오는 곳에서 처리를 합니다.
서블릿의 생명주기의 상당 부분을 프로그래머가 제어 할 수 없고, 생성 및 파괴시에 메모리 사용에 대해 걱정하지 않는다. 
Google이나 Amazon처럼 많은 각 요청에 대해 서블릿은 인스턴스화를 하는 것은 실용적이지 않으며, 서블릿 컨테이너가 multi thread를 처리합니다.



1. thread-safe하냐?

변수 counter는 인스턴스 변수이고, 클래스내에서 정의되어, 클래스 인스턴스에 속합니다.
이 값은 method호출간에 유지되며, 문제는 서블릿 컨테이너가 multi thread이고, 다중 요청을 위해 서블릿의 단일 인스턴스를 공유한다는 점이다.

이 서블릿을 동시에 실행할때 어떤 일이 발생하는지 살펴보자. 처리에 지연을 위해 sleep()를 사용한다. HTML프레림을 사용하여 동시 요청을 만듭니다.

쓰레드 안전하지 않은 서블릿 코드는 다음과 같은 결과를 생성한다.

2.첫번째 방어 : 회피

각 쓰레드에 대해 고유한 변수 인스턴스를 갖도록하기 위해 클래스 내에서 변수 선언한 내용을 method내로 변수 선언을 이동하기만 하면 된다. 차이점은 method에 대한 각 호출에 대해 새 변수가 만들어진다.

3.두번째 방어: 부분 동기화

쓰레드 동기화는 알아야 할 중요한 기술이지만, 필요하지 않으면 이걸 솔루션으로 채택하지 마세요. 코드 블록을 동기화 할때마다 시스템에 병목 현상이 발생합니다. 코드 블록을 동기화할때, 주어진 순간에 동기화된 코드 블록내에 하나의 스레드만 있을 수 있다고 JVM 알려줍니다. 다중 쓰레드에서 동기화된 코드 블록으로 스레드가 실행되면, 2번째 스레드는 1번쨰 스레드가 해당 블록을 종료할때까지 대기해야 합니다.

4.마지막 방어: 전체 동기화

서블릿 컨테이너에 쓰레드가 안전하지 않다는 것을 알려주기 위해서, 빈 인터페이스를 구현해야 합니다. 구현하려는 tag는 SingleThreadModel인터페이스 입니다. 인터페이스를 적용하면, 2개의 쓰레드가 동시에 실행 될 수 없음을 보장 합니다. (블록이 발생하므로, 되도록 사용하면 안되겠죠?)

원문 : Jul 12, 2004
https://www.javaworld.com/article/2072798/java-web-development/write-thread-safe-servlets.html?page=2 

블로그 이미지

StartGuide

I want to share the basic to programming of each category and how to solve the error. This basic instruction can be extended further. And I have been worked in southeast Asia more than 3 years. And I want to have the chance to work another country.

,