servlet의 경우는 WAS가 기동시 servlet 인스턴스 하나만 생성하여 모든 worker thread가 
공용으로 사용하기 때문에 위와 같은 현상이 발생합니다. 

전역변수(정확히는 클래스의 member 변수) 역시 인스턴스 별로 관리가 되기 때문에
위 코드는, wait 수행 전 worker thread들이 str 변수 값을 계속 덮어쓰기 때문에 발생하는 현상입니다.

JSP 같은 경우는 기본적으로 servlet과 같이 취급되나,  JSP 파일 내에 기술된 기본적인 모든 변수들이
local 변수로 취급되므로 상대적으로 servlet보다는 안전합니다.

그러므로 servlet 사용시 전역변수 및 member 변수는 모든 요청이 공통으로 사용해야 하는 read only 성격의 데이터만을
사용하는 것이 안전하며, 가급적 모든 변수는 local 변수로 사용하는 것이 좋습니다.


-> 결론은, jsp와 서블릿에서는 클래스 멤버변수를 사용하면 안된다. 멤버 변수는 해당 클레스에 접속한 모든 유저가 그 변수를 공유하게된다.

서블릿은 기본적으로 멀티스레드모델이고, 여기에서는 하나의 클래스에 쓰레드가 생성되어 한 클래스를 공유하기 때문에 클래스의 멤버변수도 여기저기 공유된다. 따라서 final static을 붙여서 쓰는 상수이외에는 멤버변수를 선언하지 말것. 

물론 의도적으로 공유하는게목적이라면 괜찮겠지만..(전체 채팅 참여자 수 등..?)


-출처

http://demo.initech.com/index.php?document_srl=957&mid=java

by 곽동현 이스텔리앙 2014.05.06 22:49
| 1 ··· 3 4 5 6 7 8 9 10 11 12 |