我讀過servlets中的代碼可以與synchronized塊同步。不過,我也讀過,雖然通常只有一個servlet實例,但servlet容器可能會保留一個實例池。這肯定意味着一個同步塊不能保證工作,因爲你不知道請求線程會選擇哪個實例?多個實例時的Servlet同步
回答
Servlet容器確實有一個用於處理請求的線程池,這意味着可能會有多個線程執行Servlet代碼,這意味着訪問任何共享的可變數據需要正確同步。
如果問題是如何使servlet的單線程的,則該方法之一是實現SingleThreadModel接口,但現在這已得到棄用。
http://docs.oracle.com/javaee/1.4/api/javax/servlet/SingleThreadModel.html
規範(3.0)的第2.2節說:
對於在分佈式環境中(默認值)不舉辦一個servlet, servlet容器必須按servlet的使用只有一個實例 聲明
所以,如果一個容器使用一個實例池,它違反了規範。我不明白爲什麼一個容器會這樣做,因爲每個servlet開發人員都知道多個線程可以同時訪問這個servlet,因此這個servlet必須是線程安全的。
謝謝,這是我所期望的。我剛發現Tomcat實現了每個servlet的一個實例。要麼我誤解了信息,要麼一些容器確實違反了規範。 – Jon 2011-12-31 12:04:50
也許你把「線程池」與「servlet實例池」混爲一談。 – 2011-12-31 12:07:16
- 1. 同步Greasemonkey腳本的多個實例
- 2. 將一個隊列實例與多個Redis實例同步
- 3. 使用多個實例同步兩個定時器(Java)
- 4. 如何在tomcat上使用同一個servlet的多個實例
- 5. 跨多個映射的Servlet實例
- 6. 同步AzMan的兩個不同實例
- 7. 紅寶石:機械化的多個相同或同步實例?
- 8. 在同一程序的多個實例之間同步
- 9. 更多線程同步實例的同步方法
- 10. 同步MongoDB實例
- 11. JBoss 4.2.3如何實現SingleThreadModel(STM):一個servlet的實例或一個servlet的多個實例?
- 12. 同時執行多個jetty runner實例
- 13. 受管實例的同步
- 14. Tomcat servlet同步
- 15. 多線程 - 同步一個對象的所有實例的塊
- 16. 同步多個UITableView實例的滾動位置
- 17. 如何同步傳遞給多個地方的實例?
- 18. 如何同步多個Azure網站實例的數據
- 19. 同一異步任務的多個實例(Windows Phone)
- 20. 訪問一個servlet實例
- 21. 保持2個Confluence實例同步?
- 22. 如何同步EC2實例
- 23. 同步於實例變量
- 24. 同步Visual Studio實例
- 25. 同步Laravel雄辯實例
- 26. 何時實際創建servlet實例?
- 27. 如何同步不同的shell實例
- 28. 跨多個實體的同步ID
- 29. 同一個UIButton的多個實例?
- 30. 同一個UIViewController的多個實例
你在這裏有什麼問題? – milan 2011-12-31 11:15:23
我想你應該閱讀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個答案的共識是每個servlet使用1個實例,所以同步將工作 – Jon 2011-12-31 11:59:07