본문 바로가기

Wanna be a Programmer/Servlet & JSP

Servlet & JSP day8 - Multi-Thread 상황에서 Data 동기화

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를 출력하는 부분

- 일관성있는 카운트를 보여준다.

 

 

순차적으로 수행될 필요가 있는 모든 작업을 동기화 블록에 넣고, 동기화된 블록 밖에서 그 결과를 사용하는 것이다.