2011-12-31 70 views
3

我讀過servlets中的代碼可以與synchronized塊同步。不過,我也讀過,雖然通常只有一個servlet實例,但servlet容器可能會保留一個實例池。這肯定意味着一個同步塊不能保證工作,因爲你不知道請求線程會選擇哪個實例?多個實例時的Servlet同步

+0

你在這裏有什麼問題? – milan 2011-12-31 11:15:23

+2

我想你應該閱讀BalusC的這兩個答案:[Servlet如何工作?](http://stackoverflow.com/questions/3106452/how-do-servlets-work-instantiation-session-variables-and-multithreading/ 3106909#3106909)和[Servlet的實例](http://stackoverflow.com/questions/2183974/difference-each-instance-of-servlet-and-each-thread-of-servlet-in-servlets/2184147#2184147) – 2011-12-31 11:20:18

+2

謝謝,從這2個答案的共識是每個servlet使用1個實例,所以同步將工作 – Jon 2011-12-31 11:59:07

回答

1

Servlet容器確實有一個用於處理請求的線程池,這意味着可能會有多個線程執行Servlet代碼,這意味着訪問任何共享的可變數據需要正確同步。

3

規範(3.0)的第2.2節說:

對於在分佈式環境中(默認值)不舉辦一個servlet, servlet容器必須按servlet的使用只有一個實例 聲明

所以,如果一個容器使用一個實例池,它違反了規範。我不明白爲什麼一個容器會這樣做,因爲每個servlet開發人員都知道多個線程可以同時訪問這個servlet,因此這個servlet必須是線程安全的。

+0

謝謝,這是我所期望的。我剛發現Tomcat實現了每個servlet的一個實例。要麼我誤解了信息,要麼一些容器確實違反了規範。 – Jon 2011-12-31 12:04:50

+1

也許你把「線程池」與「servlet實例池」混爲一談。 – 2011-12-31 12:07:16