Multi-Thread 상황에서 Data 동기화(Synchronized)
☞ Local 변수 : X
☞ Instance 변수 : O
☞ Static 변수 : O
Attribute
☞ Request Scope : X
☞ Session Scope : 이론적으로는 O, but 실제로는 X
☞ Application Scope : O
서블릿 입장에서 각각의 클라이언트는 service(), doGet(), doPost() 메서드를 통해 서블릿을 호출하는 다른 쓰레드이다. 서블릿이 단순히 요청을 읽고 응답을 반환하고 지역변수에 저장을 한다면, 각각의 쓰레드의 연결을 신경 쓸 필요가 없다. 그러나, 어떠한 정보가 비지역변수에 저장되면 각각의 클라이언트의 쓰레드가 서블릿의 비지역변수를 조작가능해진다.
ex) 두 개의 요청이 동시에 전역변수인 visitCount에 들어오면, visitCount에 동일한 값을 출력할 가능성이 존재한다. 하나의 쓰레드가 visitCount의 값을 증가시키고, 첫 번째 쓰레드가 visitCount를 출력하기 이전에 다른 쓰레드가 visitCount를 증가시키면 각각의 쓰레드는 2만큼 증가시킨 동일한 값을 출력하게 된다. 이와 같은 현상을 막기위해 동기화를 실시한다.
동기화의 세가지 방법
☞ doGet() 메소드에 synchronized 키워드를 추가하는 것이다. but, 서블릿이 한 번에 하나의 GET요청만 다룰 수 있기 때문에 적절하지 않다.
☞ 수행되는 부분을 동기화 시키는 것이다.
ex) visitCount를 증가시키는 부분과 visitCount를 출력하는 부분
- 일관성있는 카운트를 보여준다.
☞ 순차적으로 수행될 필요가 있는 모든 작업을 동기화 블록에 넣고, 동기화된 블록 밖에서 그 결과를 사용하는 것이다.
'Wanna be a Programmer > Servlet & JSP' 카테고리의 다른 글
Servlet & JSP day9 - HttpSession (0) | 2012.04.27 |
---|---|
Servlet & JSP day8 - Session, Cookie (0) | 2012.04.26 |
Servlet & JSP day8 - 요청디스패치를 이용한 전체회원정보 조회 (0) | 2012.04.26 |
Servlet & JSP day7 - 요청디스패치(request dispatch)방식을 이용한 회원정보 조회 (0) | 2012.04.25 |
Servlet & JSP day7 - 리다이렉트방식(Redirect) (0) | 2012.04.25 |