部落客廣告聯播

2009年1月20日 星期二

關於Servlet和JSP的同步化

眾所周知,Servlet/Jsp 在WebContainer裡都是被Instance後會以Multi-Thread被執行,這樣做當然是讓效能提升了不少,不過在此同時應該要注意Thread-Safe問題,對許多初入門者,常會掉入這個陷阱而不自知~~ ( Class attribute is not thread safe in Multi-Thread environment ...)

然而今天我遇到的是相反的問題:
如果說 我們想要某個 servlet或JSP同一時間只會(只能)有一個人執行那該怎做呢?

Servlet --
方法 1. doGet() 裡轉呼叫 doPost() 而doPost()宣告為 synchronized方法。
方法 2. implements javax.servlet.SingleThreadModel介面。(Servlet規格建議方式)
方法 3. 如果只是針對某些class attribute要有同步化,那只要將該class attribute宣告為synchronized即可。

JSP --
使用page Directive -- <%@page isThreadSafe="false" %>

不管是實做SingleThreadModel或是設JSP pageDirective的isThreadSafe為false, 都可以看做是將servlet的service( )方法做synchronized ( 當然底層webContainer是否是這樣做 這倒不得而知 , 可能個別webContainer會有不同的實作方式 )

另外重要的是,上列不論哪種方法一定會照成效能上的些許損耗(由其在該Servlet/JSP作業時間長,且同時間執行該servlet/JSP人數又多時) , 故除非必要 ,盡量避免使用 ~~


(
呵呵 ,都差點忘記有SingleThreadModel這個介面,在SCWCD1.3教材本來是有,SCWCD1.4似乎就沒看到,也難怪 ~~
)